package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class Server {
private ServerSocket serverSocket;
private List<PrintWriter> allOut;
private ExecutorService threadPool;
public static void main(String[] args) {
Server server = new Server();
server.start();
}
public Server(){
try {
serverSocket = new ServerSocket(8080);
allOut = new ArrayList<PrintWriter>();
threadPool = Executors.newFixedThreadPool(40);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start(){
while(true){
try {
System.out.println("等待客户端的连接...");
//监听客户端的连接
Socket socket = serverSocket.accept();
System.out.println("客户端已经连接上了!");
ClientHandler handler = new ClientHandler(socket);
threadPool.execute(handler);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private synchronized void addOut(PrintWriter out){
allOut.add(out);
}
/**
* 将给定输出流从共享集合删除
* @param out
*/
private synchronized void removeOut(PrintWriter out){
allOut.remove(out);
}
/**
* 将消息转发给所有客户端
* @param message
*/
private synchronized void sendMessage(String message){
for(PrintWriter o : allOut){
o.println(message);
}
}
//线程体,并发处理不同客户端信息的交互
public class ClientHandler implements Runnable{
private Socket socket;
/**
* 添加构造方法
* @param socket
*/
public ClientHandler(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
PrintWriter pw = null;
try {
//将客户端的信息存入allOut集合
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, "utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);
//获取socket的输入流
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in, "utf-8");
BufferedReader bf = new BufferedReader(isr);
String message = null;
while((message=bf.readLine())!= null){
sendMessage(message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
removeOut(pw);
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
java实现TCP多客户端与服务器端的通信
需积分: 44 85 浏览量
2016-04-07
20:16:30
上传
评论 4
收藏 9KB ZIP 举报
AngieRay
- 粉丝: 1
- 资源: 7
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈