Tôi hơi bối rối về cách tránh ổ cắm bị treo khi đọc. Đây là mã của tôi:Luồng đầu vào ổ cắm bị treo khi đọc lần cuối. Cách tốt nhất để xử lý điều này?
Socket socket = new Socket("someMachine", 16003);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
try {
outputStream.write(messageBuffer.toByteArray());
outputStream.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer response = new StringBuffer();
int result;
while ((result = in.read()) != -1) {
response.append(Character.toChars(result));
System.out.println(result);
}
System.out.println("Done!"); //never gets printed
} catch (...) {}
Mã trên đọc thành công tất cả dữ liệu từ luồng nhưng sau đó bị treo. Đọc lên trên mạng tôi đã mong đợi để nhận được một -1 từ máy chủ (mà tôi không thể kiểm soát) để cho biết rằng tôi đã đạt đến cuối dòng nhưng thay vào đó tôi có được điều này:
(Lots of data above this point)
57
10
37
37
69
79
70
10
Sau đó nó bị treo . Vì vậy, câu hỏi của tôi là:
1) Tôi đã mã hóa sai hoặc có vấn đề với phản hồi của máy chủ không?
2) Nếu có sự cố với phản hồi của máy chủ (nghĩa là không có -1 được trả lại), làm cách nào tôi có thể làm việc này (tức là dừng đọc khi bị treo).
Bất kỳ trợ giúp nào được đánh giá cao!
là "someMachine" đóng socket sau khi gửi byte cuối cùng? là nó chờ đợi một số trả lời/thừa nhận để làm như vậy? –
có thể trùng lặp của [vấn đề tắc nghẽn Java ....] (http://stackoverflow.com/questions/2797087/java-deadlock-problem) – finnw
được sửa trong trường hợp của tôi khi tôi thêm vào, ở cuối phía máy chủ, ' socket.close() 'hoặc' socket.shutdownOutput() ' –