java使用多線程實現多客戶端的通信


實現步驟:

服務器端:

1、創建ServerSocket對象,綁定監聽端口

2、通過accept()方法監聽客戶端請求(循環監聽)

3、server與socket建立專線連接,兩個socket在一個單獨的線程上對話、通過輸入流讀取客戶端發送的請求信息

4、通過輸出流向客戶端發送響應信息

5、server繼續等待新的連接

6、關閉相應資源

客戶端:

1、創建Socket對象,指明需要連接的服務器的地址和端口號

2、連接建立後,通過輸出流向服務器端發送請求信息

3、通過輸入流獲取服務器響應的信息

4、關閉相應的資源

Server

package com.socket;

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;

import javax.swing.text.AbstractDocument.BranchElement;

/*
 * 基於TCP協議的Socket通信,實現用戶登錄
 * 服務器端
 */
public class Server {
	public static void main(String[] args) {
		try {
			
			//1.創建一個服務器端的Socket,即ServerSocket,指定綁定的端口,並監聽此端口
			ServerSocket serverSocket=new ServerSocket(8888);
			//2.調用accept方法開始監聽,等待客戶端的連接
			Socket socket=null;
			int count=0;
			System.out.println("***服務器即將啓動,等待客戶端的連接***");
			while(true) {
				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();
		}
	}
}

Client

package com.socket;

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.net.UnknownHostException;

/*
 * 客戶端
 */
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("用戶名:xiaolu;密碼:233");
			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);
			}
			br.close();
			is.close();
			pw.close();
			os.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {              
			e.printStackTrace();
		}
		
	}
}

ServerThread

package com.socket;

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{
	//和本線程相關的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 {
			//3. 獲取輸入流,並讀取客戶端信息
			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) {
			// TODO Auto-generated catch block
			e.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();
			}
		}
		
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章