📄 server5.java
字号:
import java.net.*;
import java.io.*;
import java.util.*;
public class Server5 {
private ServerSocket server;
private BManager bMan = new BManager();//消息广播者
public Server5() {}
void startServer() {
try {
server = new ServerSocket(7777);
System.out.println("服务器套接字创建完毕");
while(true) {
Socket socket = server.accept();
//创建并运行与客户机通信的线程
new Chat_Thread(socket).start();
//向消息广播者列表添加socket
bMan.add(socket);
//向消息广播者所有客户机传送当前连接人数
bMan.sendClientInfo();
}
}catch(Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
Server5 server = new Server5();
server.startServer();
}
// 客户机通信的线程类
class Chat_Thread extends Thread{
Socket socket;
private BufferedReader reader;
private PrintWriter writer;
Chat_Thread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(),true);
String msg;
//从输出流获取消息
while((msg = reader.readLine()) != null) {
System.out.println(msg);
//向所有客户机传送消息
bMan.sendToAll(msg);
}
}catch(Exception e) {
finally {
try {
//从消息广播者列表删除socket
bMan.remove(socket);
if(reader != null) reader.close();
if(writer != null) writer.close();
if(socket != null) socket.close();
reader = null; riter = null; socket = null;
System.out.println("客户机离开");
//向所有客户机传送当前连接从数
bMan.sendClientInfo();
} catch(Exception e) {}
}
}
}
//消息广播者类继承vector类
class BManager extends Vector {
BManager () {}
void add(Socket sock) {
super.add(sock);//添加套接字
}
void remove(Socket sock) {
super.remove(sock);//删除套接字
}
//向所有客户机传送msg,同步化方法
synchronized void sendToAll(String msg) {
PrintWriter writer = null;//输出流
Socket sock; //套接字
for(int i = 0;i <size();i++) { //循环执行
sock = (socket) elementAt(i);//获取第i个套接字
try {
// 获取第i个套接字输出流
writer = new PrintWriter(sock.getOutputStream(),true);
} catch(IOException ie){}
//使用第i个套接字输出流,输出msg
if(write != null) writer.println(msg);
}
}
// 向所有客户机发送当前聊天人数
synchronized void sendClientInfo() {
String info = "当前聊天人数:" + size();
System.out.println(info);
sendToAll(info);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -