JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】
為什么80%的碼農都做不了架構師?>>> ??
TCP(Transmission Control Protocol?傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議.
面向連接:服務器創建一個連接端口,客戶端去連接服務器實現通信。
可靠的:tcp協議是是在連接成功之后才會發送數據,而基于UDP的協議是事先不會征求對方意見,直接將數據傳送出去,因此TCP協議傳輸中,數據更可靠,更安全。
基于字節流:tcp協議中傳遞的信息是以流的形式傳遞的,在java中可通過inputstream來捕獲,通過outputstream發送。
對于接收數據的時候出現假死的狀態:
readLine()函數讀取一行,結尾需要"\n"才能結束,不然會一直卡死在這里,因此大家在用printwriter的時候要print一個"\n",然后把printwriter flush掉。就不會假死了!
這樣:pw.write("fuck you cient");?? ?//send to server
?? ??? ??? pw.write("\n");
?? ??? ??? pw.flush();
在java中,tcp協議是已經封裝好的類,可直接供用戶使用。其中關鍵的兩個類是
Socket類 ? ? ServerSocket類。
ServerSocket類用來創建服務器,具體用法請參照jdk文檔。常用用法是
ServerSocket ss = new ServerSocket((int)port) //傳入一個端口號,用戶自定Socket用于控制兩端的連接,服務器的Socket可以和客戶端的Socket相連接:
socket可以使用inputstream和outputstream進行相互通信。
(服務器中通常是將已將建立連接的socket丟給子線程通信,但是點對點可以讓服務器處理一個socket就行了,不需要再生成子線程進行通信交流)
?
?
代碼分為三個文件。
程序運行結果:
?
以下是代碼附上:
//package org.cat.Client;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket;public class MyClient {public static void main(String[] args){try {Socket s = new Socket("localhost", 12341);System.out.println("conneting to server successfully");//successfully connecting to server//Now sending some data to server//1.create outputStream and so on...OutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you server"); //send to serverpw.write("\n"); //importantpw.flush();System.out.println("I have sended to server");//2.receiving data from serverInputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";while((tmp = bfdReader.readLine()) != null)System.out.println("server tells:"+tmp);//close allin.close();inReader.close();bfdReader.close();out.close();pw.close();} catch (IOException e) {System.out.println("connecting failed,have u opened server?");e.printStackTrace();}} }?
//package org.cat.Server;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class MyServer {public static void main(String[] args){try {@SuppressWarnings("resource")ServerSocket sers = new ServerSocket(12341);//then wait for client to connectSocket s;System.out.println("waiting for client to connect");s = sers.accept();new MyThread(s);} catch (IOException e) {System.out.println("set up server failed??");e.printStackTrace();}}}?
//package org.cat.Server;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket;public //service for every client class MyThread extends Thread{Socket s;public MyThread(Socket s) {this.s = s;start();//telling that connection has been settle up System.out.println("successed to connet with port of"+s.getLocalPort());//now receiving data and talk back to client//1.receivetry {InputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";if((tmp = bfdReader.readLine()) != null)System.out.println("client tells:"+tmp);//anwser clientOutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you cient"); //send to serverpw.write("\n");pw.flush();System.out.println("I have sended to client");//close allout.close();pw.close();in.close();inReader.close();bfdReader.close();} catch (IOException e1) {System.out.println("get inputStream from client failed");e1.printStackTrace();}System.out.println("now to shut connection");try {s.close();System.out.println("shut down connection successfully");} catch (IOException e) {System.out.println("shut server failed,have u opened it?");e.printStackTrace();}}}?
轉載于:https://my.oschina.net/qkmc/blog/861499
總結
以上是生活随笔為你收集整理的JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git在服务器安装完成后续工作
- 下一篇: 线性选择算法的递归实现和循环实现