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()話,它只會在連接結束後才把緩存的數據讀取出來。


