日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

發(fā)布時間:2025/3/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為了方便講解,我們把

DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));

中的dout做為Socket輸出流的代言。同樣的,din是輸入流的代言。

可以造成dout被關(guān)閉的操作有:

  • 調(diào)用dout.close();或din.close();因為使用這種流關(guān)閉,會造成socket被關(guān)閉,所以輸入輸出流都將不可再用。
  • 調(diào)用socket.close();
  • 調(diào)用socket.shutdownOutputStream(); 單方面關(guān)閉dout,此時din還可正常使用。
  • 以下,我將對socket中關(guān)閉輸出流進(jìn)行3個測試:

    • 輸出流關(guān)閉測試一:socket關(guān)閉嗎?
    • 輸出流關(guān)閉測試二:該流是否可以重新開啟?
    • 輸出流關(guān)閉測試三:輸出緩沖區(qū)里的數(shù)據(jù)是丟棄,還是發(fā)送?

    測試結(jié)果如下:

  • 測試一:dout.close();會造成socket被關(guān)閉,但socket.shutdownOutputStream()不會。

  • 測試二:不可以,會拋出異常!

  • 測試三:丟棄

  • 測試代碼:

    • client端
    /*** @author cristianoixiaoming@gmail.com* @version 1.0* @ClassName SocketTestClient* @Package InternetProgram* @ProjectName javaStudy* @description Socket測試客戶端* @date 2021-09-09 11:15* @ProductName IntelliJ IDEA*/ public class SocketTestClient {Socket mySocket;DataOutputStream dout;public static void main(String[] args){new SocketTestClient();}public SocketTestClient(){// 輸出流關(guān)閉的測試一:socket關(guān)閉嗎?test1();// 輸出流關(guān)閉測試二:該流是否可以重新開啟?test2();// 輸出流關(guān)閉測試三:輸出緩沖區(qū)里的數(shù)據(jù)是丟棄,還是發(fā)送?test3();}private void test1() {// 輸出流關(guān)閉的測試一:socket關(guān)閉嗎?System.out.println("\n****(shutdownOutput/close方式)關(guān)閉輸出流,Socket是否關(guān)閉?***\n");try {mySocket = new Socket("127.0.0.1",5555);} catch (IOException e) {e.printStackTrace();}try {dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));//下面這一句主要是用來證明socket確實處于開啟狀態(tài)System.out.println("輸出流剛打開,Socket是否關(guān)閉?" + mySocket.isClosed());mySocket.shutdownOutput();System.out.println("使用shutdownOutput關(guān)閉輸出流,Socket是否關(guān)閉?" + mySocket.isClosed());dout.close();System.out.println("使用close關(guān)閉輸出流,Socket是否關(guān)閉?" + mySocket.isClosed());} catch (IOException e) {e.printStackTrace();}}public void test2() {// 輸出流關(guān)閉測試二:使用shutdownOutputStream后,輸出流是否可以重新開啟?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("已經(jīng)關(guān)閉輸出流");// 重開輸出流dout = new DataOutputStream(mySocket.getOutputStream());dout.writeUTF("是否允許重開輸出流?");// 清空輸出緩存,確保當(dāng)dout通道沒問題時,消息可以到達(dá)服務(wù)器dout.flush();} catch (IOException e) {e.printStackTrace();System.out.println("不允許重開輸出流");} finally {try {mySocket.close();} catch (IOException e) {e.printStackTrace();}}}private void test3(){// 輸出流關(guān)閉測試三:輸出緩沖區(qū)里的數(shù)據(jù)是丟棄,還是發(fā)送?System.out.println("\n***輸出緩沖區(qū)里的數(shù)據(jù)是丟棄,還是發(fā)送?****\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后,數(shù)據(jù)發(fā)得得出去嗎?");mySocket.shutdownOutput();} catch (IOException e) {e.printStackTrace();}} }
    • server端
    /*** @author cristianoixiaoming@gmail.com* @version 1.0* @ClassName SocketTestServer* @Package InternetProgram* @ProjectName javaStudy* @description Socket測試服務(wù)端* @date 2021-09-09 13:28* @ProductName IntelliJ IDEA*/ public class SocketTestServer extends Thread{private ServerSocket myServerSocket;public static void main(String[] args){SocketTestServer sst = new SocketTestServer();sst.start();}public SocketTestServer(){// 初始化一個ServeSocket端try {int PORT = 5555;myServerSocket = new ServerSocket(PORT);} catch (IOException e) {e.printStackTrace();}}public void run(){while(true){System.out.println("我是服務(wù)器,我在5555端口監(jiān)聽....");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控制臺:

    參考文章

    總結(jié)

    以上是生活随笔為你收集整理的Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。