Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
生活随笔
收集整理的這篇文章主要介紹了
Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文計劃采用socket實現客戶端和服務端的任意雙向通信,即客戶端可以隨時給服務端發消息,服務端也可以隨時給客戶端發消息,最終結果就是一個類似與QQ的聊天軟件的功能。
以下代碼可以直接拷貝到Eclipse中運行。
前面的兩片文章都利用了socket實現了客戶端與服務器的通信,我的前兩片文章:
Java中利用socket實現簡單的服務端與客戶端的通信(入門級),實現了一個簡單的客戶端發送消息,服務器端接收消息的實力,沒有多線程,也沒有讓服務器端有消息返回。?
Java中利用socket實現簡單的服務端與客戶端的通信(基礎級),在上一篇的基礎上,在服務端實現了多線程,使得服務端可以于多個客戶端連接并接收他們發送的消息。
要想實現任意的雙向通信,以客戶端來說,時刻既需要能夠發送消息,同時也需要能夠隨時的接收服務端發來的消息,這兩個功能必須同時存在,還必須同時運行,所以這個時候就必須使用到多線程了。無論是服務端還是客戶端,都至少需要多出兩個線程,一個線程用于發送數據,一個線程用于接收數據。這是本文的關鍵。
客戶端:
package client_3;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class client_3 { public static final String IP = "localhost";//服務器地址 public static final int PORT = 10000;//服務器端口號 public static void main(String[] args) {handler(); } private static void handler(){ try { //實例化一個Socket,并指定服務器地址和端口 Socket client = new Socket(IP, PORT); System.out.println("I am a client"); //開啟兩個線程,一個負責讀,一個負責寫 new Thread(new ReadHandlerThread(client)).start(); new Thread(new WriteHandlerThread(client)).start(); } catch (Exception e) { e.printStackTrace(); } } } /* *處理讀操作的線程 */ class ReadHandlerThread implements Runnable{ private Socket client; public ReadHandlerThread(Socket client) { this.client = client; } @Override public void run() { BufferedReader in = null;try {in = new BufferedReader(new InputStreamReader(client.getInputStream()));} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try { while(true){ System.out.println("服務器說:"+in.readLine()); } } catch (IOException e) { e.printStackTrace(); } finally{ if(client != null){ client = null; } } } } /* * 處理寫操作的線程 */ class WriteHandlerThread implements Runnable{ private Socket client; public WriteHandlerThread(Socket client) { this.client = client; } @Override public void run() { PrintWriter out=null;try {out = new PrintWriter(client.getOutputStream());} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//從控制臺獲取輸入的內容 try { while(true){ out.println(reader.readLine()); out.flush();} } catch (IOException e) { e.printStackTrace(); }try {client.close();reader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}out.close();} } 可以看到,上述代碼有兩個線程類,一個負責讀,一個負責寫,同樣的,服務端的代碼也大同小異。
服務端:
package server_3;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class server_3 { public static final int PORT = 10000;//監聽的端口號 public static void main(String[] args) { System.out.println("sever begins");server_3 server = new server_3(); server.init(); } public void init() { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(PORT); while (true) { Socket client = serverSocket.accept(); //一個客戶端連接就開兩個線程分別處理讀和寫 new Thread(new ReadHandlerThread(client)).start(); new Thread(new WriteHandlerThread(client)).start(); } } catch (Exception e) { e.printStackTrace(); } finally{ try { if(serverSocket != null){ serverSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } } } /* *處理讀操作的線程 */ class ReadHandlerThread implements Runnable{ private Socket client=null; public ReadHandlerThread(Socket client) { this.client = client; } @Override public void run() { BufferedReader in = null;try{ while(true){ //讀取客戶端數據 in = new BufferedReader(new InputStreamReader(client.getInputStream()));System.out.println("客戶端說:" + in.readLine()); } }catch(Exception e){ e.printStackTrace(); }finally{ if(client != null){ client = null; } } } } /* * 處理寫操作的線程 */ class WriteHandlerThread implements Runnable{ private Socket client; public WriteHandlerThread(Socket client) { this.client = client; } @Override public void run() { PrintWriter out=null;try {out = new PrintWriter(client.getOutputStream());} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//從控制臺獲取輸入的內容 try{ while(true){ //向客戶端回復信息 out.println(reader.readLine());out.flush(); } }catch(Exception e){ e.printStackTrace(); }finally{ if(client != null){ client = null; } } } }以上程序,先啟動服務端,再啟動客戶端,就可以實現兩端的任意聊天,功能和qq等軟件類似。
總結
以上是生活随笔為你收集整理的Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中利用socket实现简单的服务
- 下一篇: ubuntu(linux)下安装open