Làm thế nào để bạn phát hiện nếu Socket#close()
đã được gọi trên một ổ cắm ở phía xa?Làm thế nào để phát hiện một ổ cắm từ xa gần?
Trả lời
Phương pháp isConnected
sẽ không hỗ trợ, nó sẽ trả lại true
ngay cả khi mặt từ xa đã đóng ổ cắm. Hãy thử điều này:
public class MyServer {
public static final int PORT = 12345;
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
Socket s = ss.accept();
Thread.sleep(5000);
ss.close();
s.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
System.out.println(" connected: " + s.isConnected());
Thread.sleep(10000);
System.out.println(" connected: " + s.isConnected());
}
}
Khởi động máy chủ, khởi động máy khách. Bạn sẽ thấy rằng nó in "connected: true" hai lần, mặc dù socket được đóng lần thứ hai.
Cách duy nhất để thực sự tìm hiểu là bằng cách đọc (bạn sẽ nhận được -1 là giá trị trả về) hoặc viết (IOException
(đường ống bị hỏng) sẽ được ném) trên InputStreams được kết hợp.
Bạn cũng có thể kiểm tra lỗi luồng đầu ra ổ cắm trong khi ghi vào ổ cắm máy khách.
out.println(output);
if(out.checkError())
{
throw new Exception("Error transmitting data.");
}
Bạn * có thể *, nhưng bạn sẽ không nhất thiết phải lấy nó ngay lập tức. – EJP
Vì câu trả lời sai lệch nên tôi quyết định kiểm tra điều này và đăng kết quả - bao gồm ví dụ kiểm tra.
Máy chủ ở đây chỉ ghi dữ liệu cho khách hàng và không mong đợi bất kỳ đầu vào nào.
Máy chủ:
ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
out.println("output");
if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
System.out.println(clientSocket.isConnected());
System.out.println(clientSocket.getInputStream().read());
// thread sleep ...
// break condition , close sockets and the like ...
}
- clientSocket.isConnected() trả về luôn luôn đúng một lần sẽ kết nối khách hàng (và ngay cả sau khi ngắt kết nối) lạ !!
- getInputStream() read()
- làm cho sự chờ đợi chủ đề cho đầu vào miễn là khách hàng được kết nối và do đó làm cho chương trình của bạn không làm bất cứ điều gì -. Trừ khi bạn nhận được một số đầu vào
- lợi nhuận -1 nếu client ngắt kết nối
- out.checkError() là đúng ngay sau khi khách hàng bị ngắt kết nối vì vậy tôi khuyên
checkError() là đúng ngay sau khi phát hiện lỗi khi viết và không sớm hơn. Nó chắc chắn không trở thành sự thật ngay khi khách hàng ngắt kết nối. -1 – EJP
phương pháp này Socke t.Có sẵn ngay lập tức sẽ ném một SocketException nếu hệ thống từ xa đã bị ngắt kết nối/đóng kết nối.
Không, nó sẽ không. Sai. Sai rồi. Thông tin sai lệch. – EJP
- 1. Làm thế nào để ngắt một luồng thực hiện một ổ cắm chặn kết nối?
- 2. Làm thế nào tôi có thể phát hiện khi ổ đĩa flash được cắm trong Linux?
- 3. Làm thế nào để phát hiện bằng cách sử dụng C# nếu một ổ đĩa được cắm vào cổng USB?
- 4. Làm thế nào để phục vụ một ổ cắm từ một ứng dụng Java EE?
- 5. Làm cách nào để tạo 'ostream' từ ổ cắm?
- 6. Làm thế nào để tràn bộ đệm ổ cắm Linux?
- 7. Cách tạo ổ cắm Boost.Asio từ ổ cắm gốc?
- 8. Làm thế nào để bạn tuôn ra ổ cắm Python?
- 9. Android: Phát hiện ổ flash USB được cắm vào
- 10. Tách một ổ cắm riêng khỏi ổ cắm của Boost.ASIO
- 11. Trong Ruby, Làm thế nào để đọc UTF-8 từ một ổ cắm?
- 12. Chỉ nhận một byte từ ổ cắm
- 13. Node.js: làm thế nào để tuôn ra ổ cắm?
- 14. Truyền video qua ổ cắm và phát từ máy khách
- 15. Python: phát hiện khi một ổ cắm ngắt kết nối vì bất kỳ lý do gì?
- 16. Ruby: Cách phát hiện khi một bên của ổ cắm đã được đóng
- 17. Làm thế nào để ngắt kết nối từ ổ cắm tcp trong NodeJs
- 18. Làm thế nào để biết khi nào một Ổ cắm đã bị ngắt kết nối
- 19. Làm thế nào để sử dụng tệp PEM để tạo một ổ cắm SSL trong Java?
- 20. C#: Làm thế nào để thực hiện một yêu cầu HTTP bằng cách sử dụng ổ cắm?
- 21. Làm thế nào để đóng (giết, giải phóng?) Một ổ cắm, trong trạng thái FIN_WAIT_2?
- 22. Làm thế nào để thiết lập một ổ cắm Winsock UDP?
- 23. Python không phát hiện một ổ cắm đóng cửa cho đến thứ hai gửi
- 24. Phát hiện bất cứ khi nào ổ cắm bị ngắt kết nối bằng cách chọn()
- 25. Làm cách nào để kiểm tra ổ cắm vẫn mở?
- 26. Làm cách nào để phát triển từ xa với Emacs?
- 27. (Làm cách nào) Tôi có thể tìm loại ổ cắm từ bộ mô tả ổ cắm không?
- 28. Làm thế nào để từ xa thực thi một kịch bản từ xa cao trong PowerShell
- 29. Làm thế nào để bạn chỉ định một phạm vi cổng cho các ổ cắm Java?
- 30. Làm thế nào để có được IP bên ngoài của một ổ cắm bằng Python?
Trong ví dụ của bạn, máy chủ không đóng kết nối TCP một cách duyên dáng (RST được gửi và đó là nó). Nếu bạn gọi close() trên socket của máy khách, kết nối sẽ được đóng một cách duyên dáng. Bạn có thể thấy điều này bằng kết quả khác nhau của hoạt động đọc: SocketException được ném so với đọc trả về -1. – Alexander
BTW, cảm ơn vì đã nhắc tôi về "bí ẩn" này trong cách làm việc của ổ cắm Java. Tôi đã hỏi một câu hỏi tiếp theo như sau: http://stackoverflow.com/questions/155243/why-is-it-impossible-without-attempting-io-to-detect-that-tcp-socket-was -gracef – Alexander
Cách duy nhất để tìm hiểu là viết. Đọc từ một ổ cắm đột ngột đóng có thể không phải luôn luôn trở lại -1. http://stackoverflow.com/a/6404085/372643 – Bruno