package wechat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TCPServer {
static ArrayList<Socket> clients = new ArrayList<>();
//接受客户端信息线程,每个客户端对应一个,用来获取客户端发送来的数据并广播到所有客户端
static class HandleMsg implements Runnable {
Socket clientSocket;
PrintWriter os = null;
String msg = null;
public HandleMsg(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
clients.add(clientSocket); //添加进客户端套接字池
//客户端刚连接时显示其端口、当前人数,并广播
msg = "欢迎【" + clientSocket.getRemoteSocketAddress() + "】加入聊天室!聊天室当前人数为:" + clients.size();
sendMsg(msg);
BufferedReader is = null;
try {
//从InputStream中读取客户端发来的数据
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while ((msg = is.readLine()) != null) {
if (msg.equals("exit")) {
//客户端发送exit退出
msg = "【" + clientSocket.getRemoteSocketAddress() + "】下线了.";
sendMsg(msg);
System.out.println(msg);
os = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
os.println("exit");
os.flush();
break;
} else {
msg = "【" + clientSocket.getRemoteSocketAddress() + "】说: " + msg;
sendMsg(msg);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
clientSocket.close();
clients.remove(clientSocket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//广播发送方法
void sendMsg(String msg) {
for (int i = clients.size() - 1; i >= 0; --i) {
try {
os = new PrintWriter(new BufferedOutputStream(clients.get(i).getOutputStream()));
os.println(msg);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
ServerSocket ss = null;
Socket clientSocket = null;
ExecutorService tp = Executors.newCachedThreadPool();
ss = new ServerSocket(65000);
System.out.println("Server " + ss.getLocalPort() + " started!");
while (true) {
try {
//阻塞,直到有客户端连接
clientSocket = ss.accept();
System.out.println(clientSocket.getRemoteSocketAddress() + " connect!");
//为客户端创建一个接收信息的线程
tp.execute(new HandleMsg(clientSocket));
} catch (IOException e) {
System.out.println(e);
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java+socket实现多线程聊天室-控制台版.rar
共9个文件
class:4个
java:2个
classpath:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 11 下载量 75 浏览量
2022-06-18
16:27:57
上传
评论 3
收藏 9KB RAR 举报
温馨提示
基于Java+socket实现多线程聊天室-控制台版 详情:https://blog.csdn.net/qq_33037637/article/details/125347646
资源推荐
资源详情
资源评论
收起资源包目录
基于Java+socket实现多线程聊天室-控制台版.rar (9个子文件)
基于Java+socket实现多线程聊天室-控制台版
WeChat
bin
wechat
TCPServer.class 2KB
TCPClient$getInputStream.class 2KB
TCPServer$HandleMsg.class 3KB
TCPClient.class 2KB
.settings
org.eclipse.jdt.core.prefs 781B
src
wechat
TCPServer.java 4KB
TCPClient.java 3KB
.project 382B
.classpath 396B
共 9 条
- 1
五星资源
- 粉丝: 5526
- 资源: 1533
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页