Java使用TCP實現線上聊天的示例程式碼
阿新 • • 發佈:2020-01-07
客戶端的程式碼:
package tcp.http; import java.io.*; import java.net.*; import java.util.Scanner; public class Client{ public static void main(String[] args) throws IOException{ Scanner scanner=new Scanner(System.in); //1.建立Socket Socket tcpClientSocket=new Socket(); //2.TCP要傳送訊息,必須先建立連線 byte[] IPv4={127,1}; //連線到本機 InetAddress serverAddress=InetAddress.getByAddress(IPv4); SocketAddress serverSocketAddress=new InetSocketAddress(serverAddress,7777); tcpClientSocket.connect(serverSocketAddress);//連線上了,(連線過程程式碼比較長,但是沒有什麼複雜的,只需要查文件根據函式的構造過程,一步步來寫就好了) while(true){ //寫個死迴圈來聊天 String request=scanner.nextLine(); //通過位元組流寫入請求 OutputStream os=tcpClientSocket.getOutputStream(); //通過列印流列印和寫入 PrintStream out=new PrintStream(os,true,"UTF-8"); out.println(request); //通過位元組流讀取響應 InputStream is=tcpClientSocket.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is,"UTF-8")); //通過readLine()來保證每次都能把一句完整的話讀完(\r\n是標誌); String response=reader.readLine(); System.out.println(" "+response); } //tcpClientSocket.close(); } }
伺服器端的程式碼:
package tcp.threads; import java.io.*; import java.net.*; import java.util.Scanner; import java.util.concurrent.*; public class Server{ private static class TalkRunnable implements Runnable{ //一個個的工作執行緒 private Socket clientSocket; TalkRunnable(Socket socket){ this.clientSocket=socket; } @Override public void run(){ try{ InetAddress clientAddress=clientSocket.getInetAddress(); int clientPort=clientSocket.getPort(); System.out.printf("ID為 %s:%d 的好友上線了%n",clientAddress.getHostAddress(),clientPort); //獲取位元組流 InputStream is=null; is=clientSocket.getInputStream(); //位元組流轉換為字元流 InputStreamReader isReader=null; isReader=new InputStreamReader(is,"UTF-8"); //獲取輸出位元組流 OutputStream os=clientSocket.getOutputStream(); //獲取列印流 PrintStream out=new PrintStream(os,"UTF-8"); //獲取緩衝字元流 BufferedReader reader=new BufferedReader(isReader); while(true){ //死迴圈聊天 String line=reader.readLine(); System.out.println(" 好友說:"+line); Scanner scanner=new Scanner(System.in); String response=scanner.nextLine(); out.println(response); } }catch(IOException e){ e.printStackTrace(); } } } public static void main(String[] args) throws IOException{ //監聽連線 ServerSocket tcpServerSocket=new ServerSocket(7777); //定義阻塞佇列 BlockingQueue<Runnable> queue=new LinkedBlockingQueue<>(); //建立執行緒池 ExecutorService pool=new ThreadPoolExecutor(100,100,TimeUnit.MILLISECONDS,queue); while(true){ //TCP 要傳送訊息必須先建立連線 Socket clientSocket=tcpServerSocket.accept(); pool.execute(new TalkRunnable(clientSocket));//有一個客戶端連線到伺服器,就起一個執行緒來專門處理這個對話 } } }
執行結果:
為什麼要使用多執行緒?
因為單執行緒會發生阻塞,聊天就進行不下去了。。。
又是自己和自己聊天的一天= =,最近好迷TCP和UDP,歡迎各位大佬批評指正呀,一起交流呀!!! 啦啦啦
對比這個聊天程式和上一篇用UDP寫的聊天程式可以更好的體會TCP和UDP的區別。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。