2010-08-06 33 views
20

Tôi chỉ tự hỏi java làm gì khi chúng ta gọi đóng trên inputStream và outStream kết hợp với một socket. Sự khác biệt từ cuộc gọi đóng trên socket, ví dụ Socket.close().Sự khác biệt giữa đóng Input/OutputStream và đóng Socket trực tiếp là gì?

nếu chúng tôi chỉ đóng luồng io trên ổ cắm, nhưng không đóng ổ cắm, chúng tôi có thể mở lại dòng io trên ổ cắm một lần nữa không?

Cảm ơn trước!

+0

Xem http://stackoverflow.com/questions/484925/does-closing-the-bufferedreader-printwriter-close-the-socket-connection – Istao

Trả lời

10

Bạn nên đóng luồng đầu ra ngoài cùng mà bạn đã tạo từ ổ cắm. Điều đó sẽ tuôn ra nó. Đóng một trong hai ổ cắm hoặc luồng đầu vào không làm điều đó để nó không đủ. Đã đóng luồng đầu ra đó mà bạn không cần phải làm gì khác.

+0

đóng luồng đầu ra == đóng chốt. tuôn ra + vây có thể không được thực hiện như trong shutdownOutput – irreputable

+3

Đó là hoàn toàn không chính xác. Đóng luồng đầu ra tuôn ra luồng * nếu cần (xem FilterOutputStream.close()) và sau đó đóng cả hai và socket. Đóng socket * hoặc * gọi shutdownOutput * không * flush ổ cắm (tức là bộ đệm gửi của nó), nó chỉ xếp hàng một FIN ở cuối bộ đệm gửi socket hiện tại. Điều gì xảy ra sau đó là không đồng bộ với quá trình đóng, trừ khi nó đã đặt thời gian chờ 'kéo dài' tích cực. – EJP

+4

Tôi có trên internet khác với của bạn không? Đọc javadoc. 'shutdownOutput' -" bất kỳ dữ liệu nào được viết trước đó sẽ được gửi đi sau chuỗi kết thúc bình thường của TCP "' getOutputStream' - "Đóng OutputStream trả về sẽ đóng socket" 'close' - không nói gì về flush và FIN. – irreputable

17

Từ các tài liệu api java cho Socket:

public void close() throws IOException Đóng ổ cắm này. Bất kỳ luồng nào hiện đang bị chặn trong một hoạt động I/O khi socket này sẽ ném ra một SocketException.

Khi ổ cắm đã được đóng, nó không có sẵn để sử dụng mạng hơn nữa (tức là không thể kết nối lại hoặc phục hồi). Cần tạo một ổ cắm mới.

Việc đóng socket này cũng sẽ đóng InputStream và OutputStream của socket.

Nếu ổ cắm này có kênh được liên kết thì kênh cũng sẽ đóng.

Đóng InputStream của Socket sẽ dẫn đến việc đóng Ổ cắm. Điều tương tự cũng xảy ra khi đóng OutputStream của Socket.

Từ các tài liệu java api cho Socket#getInputStream()

Đóng InputStream trả lại sẽ đóng socket liên quan.

Kiểm tra tài liệu API, có lý do.

+0

Vì vậy, bạn đang nói InputStream.close cuộc gọi Socket.close, mà lần lượt gọi InputStream.close, mà lần lượt gọi Socket.close, mà lần lượt gọi InputStream.close .....? – Pacerier

+0

Ổ cắm đóng khi các luồng được đóng lại. Nếu bạn gọi InputStream.close và cố gắng đọc từ socket, nó sẽ ném một ngoại lệ. Socket.close đóng đầu vào và outputstreams của socket, gọi đóng trên các luồng riêng lẻ không gọi Socket.close, nhưng vẫn sẽ dẫn đến một socket kín. – Jes

+0

Chắc chắn nó gọi Socket.close(). Hồi quy vô hạn được tránh bằng cờ 'đóng'. – EJP

1

Đây là giống như một bình luận hơn là một câu trả lời tốt: (Tôi thà thêm một bình luận cho một câu trả lời ở trên nhưng tôi không có đại diện)

Câu hỏi đặt ra, như tôi đọc nó, là " Tôi có thể đóng một dòng trên một ổ cắm và sau đó mở một dòng trên cùng một ổ cắm? "... nhưng mọi người dường như trả lời điều này:" làm thế nào tôi nên sạch sẽ đóng ổ cắm của tôi? "... đó không phải là câu hỏi được hỏi .

Câu trả lời cho câu hỏi được hỏi là "không". Khi bạn đóng luồng, bạn đóng socket.

(Tôi hiểu tại sao, trong ít nhất một trường hợp, ai đó có thể hỏi câu hỏi này. Khi bạn đang phát trực tiếp Java Properties trên ổ cắm, đầu tiếp nhận phải xem EOF để nhận ra phần cuối của thuộc tính - cho người nhận Để xem EOF, người gửi phải đóng luồng/socket.BUT, nếu bạn có giao thức lệnh/phản hồi hoạt động trên socket đó, bạn KHÔNG muốn đóng nó hoặc bạn sẽ mất kênh mà bạn muốn gửi phản hồi trên.Xem Java streaming Properties over Socket để biết một cách để xử lý việc này)

+0

Khái niệm đóng cửa của bạn và sau đó mở lại một ổ cắm và hy vọng nó vẫn kết nối là vô nghĩa. – EJP

+1

@EJP Tôi không nghĩ nhận xét của bạn hữu ích hoặc công bằng. Khái niệm "" không phải của tôi, nó được ngụ ý bởi người hỏi câu hỏi. Nếu bạn đọc câu trả lời của tôi cẩn thận hơn, bạn sẽ thấy tôi biết bạn không thể đóng và sau đó mở lại một ổ cắm. Tôi đã viết lại câu trả lời của tôi vì vậy nó dễ dàng hơn để có được quan điểm của tôi. – PMorganCA

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