socket系列(一)——socket實現推送

  • 2019 年 10 月 30 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/luo4105/article/details/72689843

Javasocket實現推送

實現

設想:用socket實現服務器與客戶端的tcp長連接,保持outputStream、InputStream連接,通過輸入輸出流實現信息實時推送

代碼

public classTestPush {        @SuppressWarnings("resource")      @Test      public void pushService() throws IOException {         ServerSocketserviceSocket= newServerSocket(10888);         while(true) {             Socketsocket= serviceSocket.accept();             InputStreamclientMsgIs= socket.getInputStream();             StringclientMsg= StreamUtil.inputStreamToString(clientMsgIs, "UTF-8");             System.out.println(clientMsg);             socket.shutdownInput();               System.out.println("請輸入推送信息:");             Scannersc = new Scanner(System.in);             StringpushMsg= sc.nextLine();               OutputStreamserviceOs= socket.getOutputStream();             BufferedWriterwriter= newBufferedWriter(newOutputStreamWriter(serviceOs));             while(!"end".equals(pushMsg)) {                writer.write(pushMsg);                writer.newLine();                writer.flush();                System.out.println("請輸入推送信息:");                sc = new Scanner(System.in);                pushMsg = sc.nextLine();             }             socket.shutdownOutput();             serviceOs.close();             socket.close();         }      }        @SuppressWarnings("resource")      @Test      public void pushClient() throws UnknownHostException,IOException {         Socketsocket= newSocket("127.0.0.1", 10888);           OutputStreamos = socket.getOutputStream();         Stringcmsg= "client connect success";         os.write(cmsg.getBytes("UTF-8"));         os.flush();                 //這是socket強制發送         socket.shutdownOutput();           InputStreamserviceMsgIs= socket.getInputStream();         BufferedReaderreader= newBufferedReader(newInputStreamReader(serviceMsgIs));         Stringcontent= null;         while(true) {             if((content = reader.readLine()) != null) {                 System.out.println(content);             }         }      }  }

運行

用junit將兩個方法運行一下,效果如下

總結

這只是一個了解原理的demo,有很都多不完善的地方。

注意的是這裡只能使用readline()和write.newLine()的原因是客戶端InputStream接收到含有換行符的時候,就會把inputStream緩存的數據拿出來,而如果直接使用InputStream.read()話,它只會在連接結束後才把緩存的數據讀取出來。