JavaSocket聊天器多线程客户端向服务端发送信息

题接上文:在现在,我们实现了客户端向服务端的信息发送,此时的发送,仅仅是单个的客户端,能否让多个客户端给服务端发信息,答案是可以的,必须要运用多线程的知识。

客户端代码:

/**
 * 实现多线程的聊天-----功能多个客户端发送信息,在服务器端会显示出来
 * @author Character_Painter
 *
 */
public class Client {
	
	private Socket socket=null;
	
	public Client() throws IOException{
		
			socket = new Socket("localhost",8088);
			/*
			 * 创建Socket的同时就发起连接,若连接异常会抛出异常。
			 *  我们通常创建Socket时会传入服务端的地址以及服务端口号。
			 *  1,服务器IP地址
			 *  2,计算机服务端口
			 */
	
	}
	public void start() throws IOException{
			
			
			GetMessageHandler ghHandler =new GetMessageHandler();
			Thread thread = new Thread(ghHandler);
			thread.start();
		
		  Scanner scanner = new Scanner(System.in);
		  OutputStream out = socket.getOutputStream();
		  OutputStreamWriter osw =new  OutputStreamWriter(out,"UTF-8");
		  PrintWriter pw = new PrintWriter(osw,true);
		//  pw.println(scanner.nextLine());
		while(true){
			pw.println(scanner.nextLine());
		}
		  
	}
	
	public static void main(String[] args) throws IOException {
		Client client = new Client();
		client.start();
		

	}
	
	class GetMessageHandler implements Runnable{

		@Override
		public void run() {
			try {
				
					
				InputStream in = socket.getInputStream();
				InputStreamReader isr = new InputStreamReader(in,"UTF-8");
				BufferedReader br = new BufferedReader(isr);
				String strMessage = null;
				while ((strMessage=br.readLine())!=null) {
					System.out.println(strMessage);
					
				}
				
				
				
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	
			
		}
		
	}

}
服务端代码:

/**
 * 服务端程序:主要任务:接收来自客户端的连接信号
 * @author Character_Painter
 *
 */
public class Server {
	private ServerSocket server=null;
	private Socket socket=null;
	public Server(){
		
			
			try {
				server = new ServerSocket(8088);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			
			
	}
	
	public void start() throws IOException{
		
			while(true){
			System.out.println("等待客户端连接......");
			//创建ServerSocket,并申请计算机的8088服务端口
			
		    socket = server.accept();
			/*
			 * 监听Socket的连接--来自客户端的Socket的。
			 * 该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,
			 * 该Socket封装与表示该客户端的有关的信息。通过这个Socket与该客户端进行通信。
			 */
			System.out.println("客户端连接成功");
			ClientHandler cHandler = new ClientHandler(socket);
			Thread thread = new Thread(cHandler);
			thread.start();
			}
		
		
		
		
	}
	
	public static void main(String[] args) throws IOException {
		Server server = new Server();
		server.start();
	}
	
	class ClientHandler implements Runnable{
		
		private Socket socket;
		private String nickName;
		
		
		public ClientHandler(Socket socket) {
			this.socket = socket;
			InetAddress address = socket.getInetAddress();
			String hostString =address.getHostAddress();
			System.out.println(hostString+"连接了");
			
		}
		
		
		@Override
		public void run() {
			PrintWriter pw = null;
			try {
				
				OutputStream out = socket.getOutputStream();
				OutputStreamWriter osw= new OutputStreamWriter(out,"utf-8");
				 pw= new PrintWriter(osw);
			
				
				
				String message = null;
				
				
				InputStream in = socket.getInputStream();
				InputStreamReader isr= new InputStreamReader(in,"utf-8");
				BufferedReader br = new BufferedReader(isr);
			
				while((message = br.readLine())!=null){
					
					System.out.println("客户端说:"+message);
					pw.println(message);
				}
			} catch (IOException e) {

				e.printStackTrace();
			}
			
			
			
			
			
			
			
		}
		
	}
	
	
	
}
运行步骤:

1.运行服务端:
2.运行第一个客户端:可以在该客户端打个字

3.运行第二个客户端,可以在该客户端打个字

运行结果:

在服务端中,会显示两个客户端的信息。

JavaSocket聊天器多线程客户端向服务端发送信息_第1张图片



你可能感兴趣的:(JAVA)