2012-01-17 32 views
18

Có thể ai đó giải thích các hành vi sau đây trong ổ cắm Java:Hành vi của ổ cắm Java khi đóng output stream

Ý tưởng chung là thế này:

  1. mở ổ cắm, Lấy I/O suối.
  2. Viết yêu cầu, Đóng luồng ra
  3. Đọc trả lời, Đóng luồng
  4. Đóng ổ cắm.

Đây là câu hỏi/vấn đề của tôi.

Nếu tôi sử dụng PrintWriter cho đầu ra, và sau đó đóng nó, Nó đóng toàn bộ ổ cắm và thao tác đọc tiếp theo không thành công.

Thay vào đó, nếu tôi trực tiếp sử dụng phương pháp shutdownOutput() của socket, nó sẽ đóng kênh luồng đầu ra một cách chính xác, trong khi vẫn giữ ổ cắm còn sống.

Tại sao đóng đối tượng PrintWriter làm cho toàn bộ ổ cắm bị hỏng?

+1

Có thể bạn cần phải tuôn ra trước khi đóng. –

+1

bạn đã thử flushing với .flush() trên các kết nối của bạn trước khi đóng printwriter của bạn để xem nếu vấn đề không xảy ra? – vcetinick

Trả lời

26

Đây có thể là những gì mã của bạn trông giống như:

Socket socket; 
PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
pw.close(); 

Bây giờ, chúng ta hãy có một cái nhìn tại các mô tả về getOutputStream() phương pháp Socket.

getOutputStream

public OutputStream getOutputStream() throws IOException

Trả về một dòng đầu ra cho ổ cắm này. Nếu ổ cắm này có một kênh liên kết thì luồng đầu ra kết quả sẽ gán tất cả các hoạt động của nó cho kênh. Nếu kênh ở chế độ không chặn thì thao tác ghi của luồng đầu ra sẽ ném một số IllegalBlockingModeException.

Đóng trả lại OutputStream sẽ đóng ổ cắm được liên kết.

Returns:

một output stream để viết byte để ổ cắm này.

Ném:

IOException - nếu xảy ra lỗi I/O khi tạo luồng đầu ra hoặc nếu ổ cắm không được kết nối.

từ mô tả ở trên, chúng tôi biết việc đóng trả lại OutputStream sẽ đóng ổ cắm liên quan.

Bây giờ, khi bạn đóng PrintWriter, nó sẽ đóng liên kết OutputStream sẽ đóng ổ cắm được liên kết.

+4

RTFM eh? :) Tôi đoán điều đó giải thích triệt để.Thanks Bloodwolf! –

+0

@Alanmars cách tránh tình huống như vậy. Điều gì sẽ xảy ra nếu tôi muốn giữ ổ cắm mở ngay cả sau khi đóng OutputStream. Có cách nào để làm điều này không? –

2

Nó có lẽ là bởi vì cách gọi phương thức close() của PrintWriter được truy tìm trở lại thông qua hệ thống phân cấp và gọi phương thức close() của SocketOutputStream là tốt. Là một phần của phương pháp close() cho số SocketOutputStream cũng gọi phương thức close() cho số Socket, đồng thời cũng có nghĩa là đóng số SocketInputStream. Gọi hàm shutdownOutput() thay vì gửi bất kỳ dữ liệu nào được viết trước đó theo sau chuỗi kết thúc bình thường của TCP. Sau đó nó sẽ vô hiệu hóa luồng đầu ra.

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