hnu202326010206 4 months ago
parent ee4daae98c
commit 777ff7095e

@ -5,6 +5,7 @@ import java.io.*;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
@ -32,14 +33,21 @@ public class WebSocketClient implements Runnable {
input = socket.getInputStream();
output = socket.getOutputStream();
System.out.println("WebSocket客户端处理器启动");
while (running) {
String message = readWebSocketFrame();
if (message != null) {
System.out.println("收到消息: " + message);
handleMessage(message);
} else {
break;
}
}
} catch (IOException e) {
System.out.println("客户端 " + username + " 断开连接");
if (running) {
System.out.println("客户端 " + username + " 连接异常: " + e.getMessage());
}
} finally {
cleanup();
}
@ -95,19 +103,30 @@ public class WebSocketClient implements Runnable {
Map<String, Object> message = gson.fromJson(jsonMessage, Map.class);
String type = (String) message.get("type");
System.out.println("处理消息类型: " + type);
if ("LOGIN".equals(type)) {
username = (String) message.get("sender");
System.out.println("用户登录: " + username);
server.addClient(username, this);
// 发送登录成功确认
Map<String, Object> ack = new HashMap<>();
ack.put("type", "ACK");
ack.put("content", "登录成功");
sendMessage(gson.toJson(ack));
} else if ("LOGOUT".equals(type)) {
running = false;
} else if ("PRIVATE_MSG".equals(type)) {
String sender = (String) message.get("sender");
String receiver = (String) message.get("receiver");
String content = (String) message.get("content");
System.out.println("转发消息: " + sender + " -> " + receiver);
server.sendPrivateMessage(sender, receiver, content);
}
} catch (Exception e) {
System.err.println("处理消息失败: " + e.getMessage());
e.printStackTrace();
}
}

@ -58,19 +58,42 @@ public class WebSocketServer {
new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
// 读取HTTP请求头
String line = reader.readLine();
if (line == null) return;
String firstLine = reader.readLine();
if (firstLine == null) {
socket.close();
return;
}
// 读取所有请求头
Map<String, String> headers = new HashMap<>();
String line;
while ((line = reader.readLine()) != null && !line.isEmpty()) {
int colonIndex = line.indexOf(':');
if (colonIndex > 0) {
String key = line.substring(0, colonIndex).trim();
String value = line.substring(colonIndex + 1).trim();
headers.put(key, value);
}
}
// 判断是HTTP请求还是WebSocket握手
if (line.startsWith("GET / HTTP")) {
if (firstLine.startsWith("GET / HTTP") && !headers.containsKey("Upgrade")) {
// 返回HTML页面
serveHtmlPage(socket);
} else if (line.contains("Upgrade: websocket")) {
} else if (headers.containsKey("Upgrade") && "websocket".equalsIgnoreCase(headers.get("Upgrade"))) {
// WebSocket握手
performWebSocketHandshake(socket, reader);
performWebSocketHandshake(socket, headers);
} else {
socket.close();
}
} catch (Exception e) {
System.err.println("处理客户端失败: " + e.getMessage());
e.printStackTrace();
try {
socket.close();
} catch (IOException ex) {
// ignore
}
}
}
@ -89,18 +112,11 @@ public class WebSocketServer {
socket.close();
}
private void performWebSocketHandshake(Socket socket, BufferedReader reader) throws Exception {
String key = null;
String line;
// 读取请求头
while ((line = reader.readLine()) != null && !line.isEmpty()) {
if (line.startsWith("Sec-WebSocket-Key:")) {
key = line.substring(19).trim();
}
}
private void performWebSocketHandshake(Socket socket, Map<String, String> headers) throws Exception {
String key = headers.get("Sec-WebSocket-Key");
if (key == null) {
System.err.println("缺少Sec-WebSocket-Key");
socket.close();
return;
}
@ -118,6 +134,8 @@ public class WebSocketServer {
socket.getOutputStream().write(response.getBytes(StandardCharsets.UTF_8));
socket.getOutputStream().flush();
System.out.println("WebSocket握手成功");
// 创建WebSocket客户端处理器
WebSocketClient client = new WebSocketClient(socket, this);
new Thread(client).start();

@ -0,0 +1,35 @@
@echo off
REM 测试Web服务器脚本
echo =========================================
echo 测试Web聊天服务器
echo =========================================
echo.
REM 检查编译
if not exist "bin\server\WebSocketServer.class" (
echo 先编译项目...
call compile_web.bat
if %errorlevel% neq 0 (
echo X 编译失败
pause
exit /b 1
)
)
echo 启动Web服务器调试模式...
echo.
echo 访问地址: http://localhost:8080
echo.
echo 测试步骤:
echo 1. 在浏览器打开上述地址
echo 2. 输入用户名登录
echo 3. 打开多个浏览器标签页测试多用户聊天
echo 4. 查看下方服务器日志输出
echo.
echo 按 Ctrl+C 停止服务器
echo =========================================
echo.
cd bin
java -cp ".;..\lib\gson-2.10.1.jar" server.WebSocketServer

@ -0,0 +1,35 @@
#!/bin/bash
# 测试Web服务器脚本
echo "========================================="
echo " 测试Web聊天服务器"
echo "========================================="
echo ""
# 检查编译
if [ ! -d "bin" ] || [ ! -f "bin/server/WebSocketServer.class" ]; then
echo "🔨 先编译项目..."
./compile_web.sh
if [ $? -ne 0 ]; then
echo "❌ 编译失败"
exit 1
fi
fi
echo "🚀 启动Web服务器调试模式..."
echo ""
echo "📱 访问地址: http://localhost:8080"
echo "🌐 局域网访问: http://$(hostname -I | awk '{print $1}'):8080"
echo ""
echo "💡 测试步骤:"
echo " 1. 在浏览器打开上述地址"
echo " 2. 输入用户名登录"
echo " 3. 打开多个浏览器标签页测试多用户聊天"
echo " 4. 查看下方服务器日志输出"
echo ""
echo "按 Ctrl+C 停止服务器"
echo "========================================="
echo ""
cd bin
java -cp ".:../lib/gson-2.10.1.jar" server.WebSocketServer
Loading…
Cancel
Save