要想服务器同时支持多个客户端的连接,就必须加入多线程的处理机制,将每一个连接的客户端都创建一个新的线程对象。
处理多个客户端 :
主线程用于监听客户端的连接,每次有连接成功,开启一个线程来处理该客户端的消息
代码示例:
服务器:
package com.lemon;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 处理多个客户端
* 主线程用于监听客户端的连接,每次有连接成功,开启一个线程来处理该客户端的消息,连接多了,就等待
* @author lemonsun
*/
public class MultiServiceDemo {
public static void main(String[] args) {
//创建一个固定大小的线程池 用来处理客户端请求
ExecutorService es = Executors.newFixedThreadPool(3);
try {
//创建服务器
ServerSocket server = new ServerSocket(6666);
System.out.println("服务器已经启动,正在等待连接...");
while(true){ //反复接受客户端发来的请求
Socket socket = server.accept(); //接受客户端请求, 如果没有请求,阻塞在这 等待
System.out.println(server.getInetAddress().getHostAddress()); //输出客户端IP地址
//启动线程 把一个socket交给一个线程处理
es.execute(new userThread(socket)); //每次用一个线程处理socket
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 用来处理客户端请求的线程任务
*/
class userThread implements Runnable{
private Socket socket;
public userThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//输入输出流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
//读取客户端发来的信息
String info = br.readLine();
System.out.println(info);
//服务器返回给客户端的信息
ps.println("echo:" + info);
ps.flush(); //刷新缓存
br.close();
ps.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package com.lemon;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端:
*
* @author lemonsun
*/
public class MutilClientDemo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
//创建一个Socket对象 指定要连接的服务器:IP+端口号
Socket socket = new Socket("localhost",6666);
//获取Socket的输出输入流
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//写数据
System.out.println("请输入发送的消息:");
String info = input.nextLine();
ps.println(info);
ps.flush();//刷新
//读取服务器返回的信息
info = br.readLine();
System.out.println("服务器返回的信息:" + info);
ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先开启服务器,再开启客户端,多开几个客户端