Java中利用socket實現簡單的服務端與客戶端的通訊(基礎級)
阿新 • • 發佈:2019-02-17
在上一篇文章中,簡單的介紹了java中入門級的socket程式設計,簡單的實現了客戶端像伺服器端傳送資料,伺服器端將資料接收並顯示在控制檯,沒有涉及多執行緒。上一篇文章的連結:Java中利用socket實現簡單的服務端與客戶端的通訊(入門級)
這次,我們將上一節中的程式碼進行少許的更改,將伺服器更改為多執行緒,使得伺服器可以為多個客戶端服務。
因為是伺服器端實現的多執行緒,所以客戶端的程式碼不用做任何更改,和上一篇中的一樣。只需要對服務端的程式碼進行稍許更改即可。
在專案中新建一個類,這個類就是執行緒類,所以要繼承自Thread類,該類的程式碼如下:
在上述程式碼中,MyThread的建構函式將socket傳入類內部的socket中,同時,將通訊的 主要任務都寫在了這個執行緒類中。package server_1; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class MyThread extends Thread { // Socket socket=null; public MyThread(Socket socket) throws Exception{ this.socket=socket; } public void run(){ BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //啟動緩衝區 //out = new PrintWriter(client.getOutputStream()); while (true) { String msg=null; try { msg = in.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 將客戶端傳送來的資訊儲存在msg中 System.out.println(msg); if (msg.equals("shutdown")) { //客戶端如果傳送的是shutdown,就關閉客戶端 break; } } try { in.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //執行相應的關閉操作 } }
以下是主類中的程式碼:
可以看到,此次在服務端加了一個沒有退出條件的迴圈操作,迴圈中監聽網路中的socket資訊,當有客戶端連線的時候,就講這個socket傳給一個執行緒去執行,同時顯示出目前連線到服務端的客戶端的數量。package server_1; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class server_1 { public static void main(String[] args) throws Exception { //將異常全部丟擲 ServerSocket server = new ServerSocket(10000); //用serversocket來啟動伺服器,並指定埠號 System.out.println("伺服器啟動。。。"); int count=0; while(true){ Socket socket = server.accept(); //獲取客戶端的socket資訊 MyThread mythread=new MyThread(socket); mythread.start(); count++; System.out.println("客戶端數量為:"+count); } //server.close(); //PrintWriter out = null; //} } }
測試時,先執行服務端,然後開啟兩次客戶端,分別像服務端傳送資料,可以看到服務端可以顯示出連線的客戶端的數量,並且可以正常的顯示客戶端傳送過來的資料。
2015年11月19日 西安交通大學