用java語言構建一個網路伺服器,實現用戶端和伺服器之間通訊,實現用戶端擁有獨立線程,互不干擾。
應用多線程來實現伺服器與多線程之間的通訊的基本步驟
- 伺服器端建立ServerSocket,迴圈調用accept()等待用戶端連結
- 用戶端建立一個Socket並請求和伺服器端連結
- 伺服器端接受用戶端請求,建立socekt與該用戶端建立專線連結
- 建立連結的socket在一個單獨的線程上對話
- 伺服器繼續等待新的連結
伺服器端Server.java
package test.concurrent.socket; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * Created by dong on 15-6-22. * 基於TCP協議的Socket通訊,實現使用者登入 * 伺服器端 */ public class Server { public static void main(String[] args) { try { //1、建立一個伺服器端Socket,即ServerSocket, 指定綁定的連接埠,並監聽此連接埠 ServerSocket serverSocket = new ServerSocket(8888); Socket socket = null; //記錄用戶端的數量 int count = 0; System.out.println("***伺服器即將啟動,等待用戶端的連結***"); //迴圈監聽等待用戶端的連結 while (true){ //調用accept()方法開始監聽,等待用戶端的連結 socket = serverSocket.accept(); //建立一個新的線程 ServerThread serverThread = new ServerThread(socket); //啟動線程 serverThread.start(); count++; //統計用戶端的數量 System.out.println("用戶端的數量: " + count); InetAddress address = socket.getInetAddress(); System.out.println("當前用戶端的IP : " + address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }
伺服器端線程處理類ServerThread.java
package test.concurrent.socket; import java.io.*; import java.net.Socket; /** * Created by dong on 15-6-22. * 伺服器端線程處理類 */ public class ServerThread extends Thread { //和本線程相關的Socket Socket socket = null; public ServerThread(Socket socket){ this.socket = socket; } //線程執行的操作,響應用戶端的請求 public void run(){ InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; try { //擷取一個輸入資料流,並讀取用戶端的資訊 is = socket.getInputStream(); isr = new InputStreamReader(is); //將位元組流轉化為字元流 br = new BufferedReader(isr); //添加緩衝 String info = null; //迴圈讀取資料 while ((info = br.readLine()) != null){ System.out.println("我是伺服器,用戶端說: " +info); } socket.shutdownInput(); //關閉輸入資料流 //擷取輸出資料流,響應用戶端的請求 os = socket.getOutputStream(); pw = new PrintWriter(os); //封裝為列印流 pw.write("歡迎你"); pw.flush(); //將緩衝輸出 } catch (IOException e) { e.printStackTrace(); }finally { try { //關閉資源 if (pw != null) pw.close(); if (os != null) os.close(); if (is != null) is.close(); if (isr != null) isr.close(); if (br != null) br.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
用戶端Client.java
package test.concurrent.socket; import java.io.*; import java.net.Socket; /** * Created by dong on 15-6-22. * 用戶端 */ public class Client { public static void main(String[] args) { try { //1、建立用戶端Socket,指定伺服器連接埠號碼和地址 Socket socket = new Socket("localhost",8888); //2、擷取輸出資料流,向伺服器發送資訊 OutputStream os = socket.getOutputStream(); //位元組輸出資料流 PrintWriter pw = new PrintWriter(os); //將輸出資料流封裝為列印流 pw.write("使用者名稱:tom; 密碼:456"); pw.flush(); socket.shutdownOutput(); //關閉輸出資料流 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String info = null; //迴圈讀取 while ((info = br.readLine()) != null){ System.out.println("我是用戶端:伺服器說:" + info); } br.close(); is.close(); isr.close(); pw.close(); os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。