生活随笔
收集整理的這篇文章主要介紹了
Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了方便講解,我們把
DataOutputstream dout
= new DataOutputStream(new BufferedOutputStream(mySocket
.getOutputStream()));
中的dout做為Socket輸出流的代言。同樣的,din是輸入流的代言。
可以造成dout被關閉的操作有:
調用dout.close();或din.close();因為使用這種流關閉,會造成socket被關閉,所以輸入輸出流都將不可再用。調用socket.close();調用socket.shutdownOutputStream(); 單方面關閉dout,此時din還可正常使用。
以下,我將對socket中關閉輸出流進行3個測試:
- 輸出流關閉測試一:socket關閉嗎?
- 輸出流關閉測試二:該流是否可以重新開啟?
- 輸出流關閉測試三:輸出緩沖區里的數據是丟棄,還是發送?
測試結果如下:
測試一:dout.close();會造成socket被關閉,但socket.shutdownOutputStream()不會。
測試二:不可以,會拋出異常!
測試三:丟棄
測試代碼:
public class SocketTestClient {Socket mySocket
;DataOutputStream dout
;public static void main(String[] args
){new SocketTestClient();}public SocketTestClient(){test1();test2();test3();}private void test1() {System.out
.println("\n****(shutdownOutput/close方式)關閉輸出流,Socket是否關閉?***\n");try {mySocket
= new Socket("127.0.0.1",5555);} catch (IOException e
) {e
.printStackTrace();}try {dout
= new DataOutputStream(new BufferedOutputStream(mySocket
.getOutputStream()));System.out
.println("輸出流剛打開,Socket是否關閉?" + mySocket
.isClosed());mySocket
.shutdownOutput();System.out
.println("使用shutdownOutput關閉輸出流,Socket是否關閉?" + mySocket
.isClosed());dout
.close();System.out
.println("使用close關閉輸出流,Socket是否關閉?" + mySocket
.isClosed());} catch (IOException e
) {e
.printStackTrace();}}public void test2() {System.out
.println("\n****使用shutdownOutputStream后,輸出流是否可以重新開啟?***\n");try {mySocket
= new Socket("127.0.0.1",5555);} catch (IOException e
) {e
.printStackTrace();}try {dout
= new DataOutputStream(new BufferedOutputStream(mySocket
.getOutputStream()));mySocket
.shutdownOutput();System.out
.println("已經關閉輸出流");dout
= new DataOutputStream(mySocket
.getOutputStream());dout
.writeUTF("是否允許重開輸出流?");dout
.flush();} catch (IOException e
) {e
.printStackTrace();System.out
.println("不允許重開輸出流");} finally {try {mySocket
.close();} catch (IOException e
) {e
.printStackTrace();}}}private void test3(){System.out
.println("\n***輸出緩沖區里的數據是丟棄,還是發送?****\n");try {mySocket
= new Socket("127.0.0.1",5555);} catch (IOException e
) {e
.printStackTrace();}try {dout
= new DataOutputStream(new BufferedOutputStream(mySocket
.getOutputStream()));dout
.writeUTF("shutdownOutput后,數據發得得出去嗎?");mySocket
.shutdownOutput();} catch (IOException e
) {e
.printStackTrace();}}
}
public class SocketTestServer extends Thread{private ServerSocket myServerSocket
;public static void main(String[] args
){SocketTestServer sst
= new SocketTestServer();sst
.start();}public SocketTestServer(){try {int PORT
= 5555;myServerSocket
= new ServerSocket(PORT
);} catch (IOException e
) {e
.printStackTrace();}}public void run(){while(true){System.out
.println("我是服務器,我在5555端口監聽....");try {Socket socket
= myServerSocket
.accept();DataInputStream din
= new DataInputStream(new BufferedInputStream(socket
.getInputStream()));String msgIn
= din
.readUTF();System.out
.println(msgIn
.trim());} catch (IOException e
) {e
.printStackTrace();}}}
}
client控制臺:
server控制臺:
參考文章
總結
以上是生活随笔為你收集整理的Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。