📄 server.java
字号:
package org.phyeas.server;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 服务器
*
* @author _phyeas
*
*/
public class Server implements Runnable {
private int port;
private Thread thread;
private List<Group> groups = new ArrayList<Group>();
private List<User> allUsers = new ArrayList<User>();
/**
* 构造服务器,使用默认端口:5000
*/
public Server() {
port = 5000;
}
/**
* 构造服务器,使用指定端口
*
* @param port
* 服务器监听端口
*/
public Server(int port) {
this.port = port;
}
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("成功监听端口:" + port + ",开始服务...");
while (thread != null) {
Socket socket = serverSocket.accept();// 接受连接
User user = new User(socket, this);
user.start();
allUsers.add(user);
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
this.stop();
}
/**
* 接收到数据
*
* @param data
* 数据
* @param user
* 发送数据的用户
*/
public void revice(byte[] data, User user) {
if (data.length >= 3) {
if (data[0] == Byte.MIN_VALUE && data[1] == Byte.MAX_VALUE) {// 系统预设
ByteArrayOutputStream bo = new ByteArrayOutputStream();
switch (data[2]) {
case 0x00:// TODO 设置个人信息
System.out.println("设置个人信息");
user.setId((int) data[3] * Byte.MAX_VALUE + data[4]);
bo.write(data, 4, data.length - 4);
user.setName(new String(bo.toByteArray()));
break;
case 0x01:// TODO 加入组
System.out.println(" 加入组" + data[3]);
Group g = getGroupById(data[3]);
if (g == null) {
g = new Group();
g.setId(data[3]);
if (data[3] <= 0 || getGroupById(data[3]) != null) {
g.setId(genertorGroupId());
}
bo = new ByteArrayOutputStream();
bo.write(data, 4, data.length - 4);
g.setName(new String(bo.toByteArray()));
groups.add(g);
}
g.getUsers().add(user);
if (user.getCurrentGroup() != null) {
user.getCurrentGroup().getUsers().remove(user);
}
user.setCurrentGroup(g);
break;
case 0x02:// TODO 退出组
System.out.println(" 退出组");
Group g2 = user.getCurrentGroup();
if (g2 == null) {
g2 = getGroupById(data[3]);
}
if (g2 != null) {
g2.getUsers().remove(user);
}
break;
case 0x05:// TODO 断开连接
System.out.println(" 断开连接");
if (user.getCurrentGroup() != null) {
user.getCurrentGroup().getUsers().remove(user);
}
user.stop();
break;
case 0x03:// TODO 请求组列表
System.out.println(" 请求组列表");
byte[] b = new byte[] { Byte.MIN_VALUE, Byte.MAX_VALUE,
0x03 };
bo.write(b, 0, b.length);
for (Group g3 : groups) {
// 组ID占一位
b = new byte[] { g3.getId() };
bo.write(b, 0, b.length);
b = g3.getName().getBytes();
bo.write(b, 0, b.length);
b = new byte[] { 0x10 };// 分隔符 0x10
bo.write(b, 0, b.length);
}
user.send(bo.toByteArray());
break;
case 0x04:// TODO 请求组成员列表
System.out.println(" 请求组成员列表:" + data[3]);
Group g4 = getGroupById(data[3]);
if (g4 != null) {
byte[] b2 = new byte[] { Byte.MIN_VALUE,
Byte.MAX_VALUE, 0x04 };
bo.write(b2, 0, b2.length);
for (User u : g4.getUsers()) {
// 用户ID占两位
b = new byte[] {
(byte) (u.getId() / Byte.MAX_VALUE),
(byte) (u.getId() % Byte.MAX_VALUE) };
bo.write(b, 0, b.length);
b = u.getName().getBytes();
bo.write(b, 0, b.length);
b = new byte[] { 0x10 };// 分隔符 0x10
bo.write(b, 0, b.length);
}
user.send(bo.toByteArray());
}
break;
default:
System.out.println("未知功能:" + data[2] + ",所有的数据是:"
+ Arrays.toString(data));
break;
}
} else {// 其他信息
if (user.getCurrentGroup() != null) {
for (User u : user.getCurrentGroup().getUsers()) {
u.send(data);
}
} else {
System.out.println("用户未加入组.");
}
}
}
}
private byte genertorGroupId() {
for (byte i = 0; i < Byte.MAX_VALUE; i++) {
if (getGroupById(i) == null) {
return i;
}
}
return 0;
}
public Group getGroupById(byte id) {
for (Group g : groups) {
if (g.getId() == id) {
return g;
}
}
return null;
}
/**
* 开始服务
*/
public void start() {
thread = new Thread(this);
thread.start();
}
/**
* 开始服务
*
* @param port
* 端口号
*/
public void start(int port) {
this.port = port;
start();
}
/**
* 停止服务
*/
public void stop() {
thread = null;
}
public Thread getThread() {
return thread;
}
public void setThread(Thread thread) {
this.thread = thread;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -