📄 bmanager.java
字号:
//聊天工具 - 服务器代码
import java.net.*;
import java.io.*;
import java.util.*;
public class Server5 {
private ServerSocket server;
String test = "测试数据";
private BManager bMan = new BManager();
private AManager aMan = new AManager();
private Hashtable map = new Hashtable();
public Server5() {
startServer();
}
void startServer() {
try {
server = new ServerSocket(7778);
System.out.println("服务器创建完毕");
} catch (Exception e) {
// TODO: handle exception
}
while (true) {
Socket socket = null;
try {
socket = server.accept();
} catch (Exception e) {
// TODO: handle exception
}
new Chat_Thread(socket).start();
// 当有用户连接时 把其放进map里面 并且用 ip 和 端口号 唯一标识
String flag = "";
try {
flag = socket.getRemoteSocketAddress().toString();
} catch (Exception e) {
System.err.println("数据转换 " + e);
}
bMan.sendToUser("<thisname>"+flag, socket);
map.put(flag, socket);
bMan.add(socket);
aMan.add(flag);
// 用户上线 先把当前所有在线用户信息 以字符串的形式 传递给该用户
bMan.sendToAll(aMan.getFlags());
// 同时 把这个人上线的消息发送给所有人
// 客户端收到这条信息后 更新自己的在线人员列表
// bMan.sendClientInfo();
}
}
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()));
} catch (Exception e) {
System.err.println("消息读取错误 = " + e);
}
String msg = "";
try {
while ((msg = reader.readLine()) != null) {
System.out.println(msg);
if (msg == null || msg.trim().length() == 0)
continue;
System.out.println(msg);
/**
* 拆开字符串 从中得到 信息传送方向 把信息传递到指定的socket
*
* 如果是以<ALL>开头 就把消息发给全体 如果是以<sendto>开头 ,则取到</sendto>
*/
String sendTo = "";
String sendTo2 = "";
if(msg.startsWith("<sendTo>")){
sendTo = msg.substring(msg.indexOf("#")+1 , msg.indexOf("</sendTo>"));
sendTo2 = msg.substring( msg.indexOf("<sendTo>")+8,msg.indexOf("#") );
}else{
System.out.println("here");
}
bMan.sendToAll(msg);
}
} catch (Exception e) {
System.err.println("############################" + e);
} finally {
try {
aMan.remove(socket.getRemoteSocketAddress().toString());
bMan.remove(socket);
bMan.sendToAll(aMan.getFlags());
if (reader != null)
reader.close();
if (writer != null)
writer.close();
if (socket != null)
socket.close();
reader = null;
writer = null;
socket = null;
System.out.println("客户机离开.");
bMan.sendClientInfo();
} catch (Exception e) {
}
}
}
}
class AManager extends Vector {
/** 通过一个方法 把Vector里面的所有数据 全部以固定格式 放到一个String里面 */
String getFlags() {
String flags = "<userList>";
String flag = "";
for (int i = 0; i < size(); i++) {
flag = (String) elementAt(i);
flags += flag;
if(!( elementAt(i).toString() .equals( (String)this.lastElement()))){
flags+="#";
}
}
return flags;
}
/** 存放在线列表 */
AManager() {
}
void add(String flag) {
super.add(flag);
}
void remove(String flag) {
super.remove(flag);
}
}
class BManager extends Vector {
BManager() {
}
/** 添加删除一个Socket */
void add(Socket sock) {
super.add(sock);
}
void remove(Socket sock) {
super.remove(sock);
}
synchronized void sendToAll(String msg) {
System.out.println("当前用户列表" + msg);
PrintWriter writer = null;
Socket sock;
for (int i = 0; i < size(); i++) {
sock = (Socket) elementAt(i);
try {
writer = new PrintWriter(sock.getOutputStream(), true);
} catch (IOException ie) {
}
if (writer != null)
writer.println(msg);
}
}
synchronized void sendToUser(String msg ,Socket socket) {
PrintWriter writer = null;
try {
writer = new PrintWriter(socket.getOutputStream(), true);
} catch (IOException ie) {
}
if (writer != null)
writer.println(msg);
}
/** 向所有人发送当前用户列表 */
synchronized void sendClientInfo() {
String info = "当前聊天人数: " + size();
System.out.println(info);
sendToAll(info);
}
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public static void main(String[] args) {
Server5 server = new Server5();
System.out.println(server.getTest());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -