要想服务器同时支持多个客户端的连接,就必须加入多线程的处理机制,将每一个连接的客户端都创建一个新的线程对象。
package com.vince; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MutilServerDemo { /** * 服务器*/ public static void main(String[] args) { ExecutorService es=Executors.newCachedThreadPool(); try { //端口号从1024~65535 ServerSocket ss=new ServerSocket(8000); System.out.println("服务器已启动,正在等待连接..."); while(true){ Socket socket=ss.accept();//等待客户端连接,该方法会阻塞 es.execute(new ClientThread(socket)); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } //处理客户请求的线程 static class ClientThread implements Runnable{ private Socket socket; public ClientThread(Socket socket){ this.socket=socket; } public void run() { try { System.out.println("客户端的IP为:"+socket.getInetAddress().getHostAddress()); InputStream input=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(input)); OutputStream output=socket.getOutputStream(); PrintStream ps=new PrintStream(output); while(true){ String info=br.readLine(); if(info==null||"bye".equals(info)){ break; } System.out.println(info); ps.println("echo:"+info); } input.close(); output.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }
package com.vince; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; //客户端 public class MutilClientDemo { public static void main(String[] args) { // 连接服务器 try { Socket socket = new Socket("localhost", 8000); System.out.println("连接成功!"); boolean flag=true; OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream(); PrintStream ps = new PrintStream(out); BufferedReader br = new BufferedReader(new InputStreamReader(in)); Scanner input=new Scanner(System.in); while(flag){ System.out.println("请输入:"); String info=input.next(); if("bye".equals(info)){ flag=false; } ps.println(info); info = br.readLine(); System.out.println(info); } out.close(); in.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
测试时,使用cmd命令打开多个框(代表多个客户端),执行java命令。