Java Socket應用(七)——使用多線程實現多用戶端的通訊

來源:互聯網
上載者:User

標籤:

轉載請註明: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應用(七)——使用多線程實現多用戶端的通訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.