標籤:
轉載請註明:http://blog.csdn.net/uniquewonderq
問題:一個服務端可以跟多個用戶端通訊
基本步驟:
1.伺服器端建立ServerSocket方法,迴圈調用accept()方法等待用戶端串連
2.用戶端建立socket和服務的請求串連
3.服務端接受用戶端的請求,建立專線串連
4.建立串連的兩個socket在一個單獨的線程上對話
5.伺服器端繼續等待新的串連
建立一個伺服器相關的線程類:
package com.test;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 ServerThread extends Thread {// 和本線程相關的SocketSocket 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();//調用flush()方法將緩衝輸出} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//關閉資源try {if(pw!=null)pw.close();if(os!=null)os.close();if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}
2.server伺服器端
package com.test;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.InetAddress;import java.net.ServerSocket;import java.net.Socket;/* * 基於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();}}}
3.client用戶端
package com.test;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;import java.util.logging.Level;import java.util.logging.Logger;/** * * @author wonderq */public class client {//用戶端 public static void main(String[] args) { try { //1.建立用戶端Socket,指定伺服器位址和連接埠號碼 Socket socket=new Socket("127.0.0.1", 8888); //2.擷取輸出資料流,用來向伺服器發送資訊 OutputStream os=socket.getOutputStream();//位元組輸出資料流 //轉換為列印流 PrintWriter pw=new PrintWriter(os); pw.write("使用者名稱:wonderq;密碼:root"); pw.flush();//重新整理緩衝,向伺服器端輸出資訊 //關閉輸出資料流 socket.shutdownOutput(); //3.擷取輸入資料流,用來讀取伺服器端的響應資訊 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String info=null; while((info=br.readLine())!=null){ System.out.println("我是用戶端,伺服器端返回的資訊是:"+info); } //4.關閉資源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (IOException ex) { Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); } }}
先運行伺服器端輸出:
***伺服器即將啟動,等待用戶端的串連***
之後再運行用戶端:
再查看服務端:
更改用戶端的輸出資訊, pw.write("使用者名稱:user;密碼:admin");
然後再啟動一個用戶端。啟動後用戶端輸出資訊不變,服務端資訊變化如下:
可以說明伺服器端在一直迴圈監聽新的用戶端的串連。
因為都是本機,所有ip都是127.0.0.1如果在真是情況下,那麼會大不一樣。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java Socket應用(七)——使用多線程實現多用戶端的通訊