2010-10-18 41 views
22

Trong Java API,Việc đóng luồng đầu vào của ổ cắm cũng có đóng kết nối ổ cắm không?

 

Socket socket = serverSocket.accept(); 
BufferedReader fromSocket = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
PrintWriter toSocket = new PrintWriter(socket.getOutputStream()); 
//do sth with fromSocket ... and close it 
fromSocket.close(); 
//then write to socket again 
toSocket.print("is socket connection still available?\r\n"); 
//close socket 
socket.close(); 
 

Trong đoạn mã trên, sau khi tôi đóng InputStream fromSocket, có vẻ như kết nối ổ cắm không có sẵn nữa - khách hàng sẽ không nhận được "là kết nối ổ cắm vẫn sẵn" tin nhắn . Điều đó có nghĩa là đóng luồng đầu vào của ổ cắm cũng tự đóng chính socket đó không?

+0

Không, nó không ném bất kỳ ngoại lệ ở phía máy chủ. Có vẻ như obj đầu ra toSocket vẫn hoạt động ở phía máy chủ, nhưng ở phía máy khách, kết nối được đóng lại. – dolaameng

Trả lời

35

Có, đóng luồng đầu vào sẽ đóng socket. Bạn cần phải sử dụng phương pháp shutdownInput trên ổ cắm, để close just the input stream:

//do sth with fromSocket ... and close it 
socket.shutdownInput(); 

Sau đó, bạn vẫn có thể gửi đến các ổ cắm đầu ra

//then write to socket again 
toSocket.print("is socket connection still available?\r\n"); 
//close socket 
socket.close(); 
+3

Không, nó tắt một cách, đóng nửa đầu vào của ổ cắm (để bạn không thể nhận thêm dữ liệu), nhưng vẫn cho phép bạn gửi tin nhắn trên nửa đầu, mà tôi nghĩ là những gì bạn đang hỏi. Khi bạn cuối cùng gọi close() trên socket, phía đầu ra cũng được đóng lại. –

+1

Có, đóng luồng đầu vào sẽ đóng socket. Ditto dòng đầu ra. Vì vậy, tất nhiên những gì bạn nên đóng luôn luôn là dòng đầu ra, do đó, nó được đỏ mặt. – EJP

+0

Không, nó không thể mở lại được. –

Các vấn đề liên quan