hnu202326010206 4 months ago
parent 74027cfc7b
commit d63021ab1f

@ -0,0 +1,333 @@
# 故障排除指南
## 问题找不到web文件
### 错误信息
```
读取文件失败: 文件不存在: web/index.html
```
### 原因
服务器在错误的目录中运行无法找到web文件夹。
### 解决方案
#### 方案1使用提供的启动脚本推荐
**Linux/openEuler:**
```bash
# 确保在项目根目录
cd /path/to/cserver
# 使用快速启动脚本
chmod +x quick_start.sh
./quick_start.sh
```
**Windows:**
```cmd
REM 确保在项目根目录
cd C:\path\to\cserver
REM 使用快速启动脚本
quick_start.bat
```
#### 方案2检查项目结构
运行检查脚本:
**Linux/openEuler:**
```bash
chmod +x check_setup.sh
./check_setup.sh
```
**Windows:**
```cmd
check_setup.bat
```
确保输出显示:
```
✓ web/index.html
✓ web/style.css
✓ web/app.js
```
#### 方案3手动启动确保在正确目录
**Linux/openEuler:**
```bash
# 1. 确保在项目根目录包含web文件夹的目录
pwd # 应该显示 .../cserver
# 2. 检查web文件是否存在
ls web/
# 3. 编译
./compile_web.sh
# 4. 从项目根目录启动不要cd到bin目录
java -cp "bin:lib/gson-2.10.1.jar" server.WebSocketServer
```
**Windows:**
```cmd
REM 1. 确保在项目根目录
cd
REM 2. 检查web文件
dir web\
REM 3. 编译
compile_web.bat
REM 4. 从项目根目录启动
java -cp "bin;lib\gson-2.10.1.jar" server.WebSocketServer
```
---
## 问题:编译失败
### 错误信息
```
找不到符号: Gson
```
### 解决方案
下载Gson库
**Linux/openEuler:**
```bash
./download_gson.sh
```
**Windows:**
```cmd
download_gson.bat
```
或手动下载:
1. 访问https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar
2. 保存到 `lib/gson-2.10.1.jar`
---
## 问题:连接失败
### 浏览器显示
```
连接失败
```
### 解决方案
1. **检查服务器是否启动**
```bash
# 应该看到类似输出:
# WebSocket服务器启动成功监听端口: 8080
```
2. **检查端口是否被占用**
**Linux:**
```bash
netstat -tuln | grep 8080
# 或
lsof -i :8080
```
**Windows:**
```cmd
netstat -ano | findstr :8080
```
3. **检查防火墙**
**openEuler/CentOS:**
```bash
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
```
**Ubuntu:**
```bash
sudo ufw allow 8080/tcp
```
4. **尝试使用localhost**
浏览器访问:`http://localhost:8080`
---
## 问题:无法发送消息
### 症状
- 输入框是灰色的
- 点击发送按钮没有反应
### 解决方案
1. **确保已选择聊天对象**
- 在左侧用户列表中点击一个用户
- 输入框应该变为可用状态
2. **检查WebSocket连接**
- 打开浏览器开发者工具F12
- 查看Console标签是否有错误
- 查看Network标签找到WebSocket连接
3. **刷新页面重新登录**
- 按F5刷新页面
- 重新输入用户名登录
---
## 问题:看不到其他用户
### 症状
- 用户列表显示"暂无其他用户在线"
- 明明有其他用户登录了
### 解决方案
1. **确认其他用户已成功登录**
- 检查服务器控制台输出
- 应该看到"用户 XXX 已登录"
2. **刷新用户列表**
- 退出登录后重新登录
- 或刷新浏览器页面
3. **检查用户名**
- 不同用户必须使用不同的用户名
- 用户名区分大小写
---
## 问题Java版本不兼容
### 错误信息
```
Unsupported class file major version
```
### 解决方案
确保使用Java 11或更高版本
```bash
java -version
```
应该显示:
```
java version "11.0.x" 或更高
```
如果版本过低请升级Java
**openEuler:**
```bash
sudo yum install java-11-openjdk-devel
```
**Ubuntu:**
```bash
sudo apt install openjdk-11-jdk
```
---
## 问题:权限被拒绝
### Linux错误
```
Permission denied: ./quick_start.sh
```
### 解决方案
添加执行权限:
```bash
chmod +x quick_start.sh
chmod +x compile_web.sh
chmod +x download_gson.sh
chmod +x check_setup.sh
```
---
## 调试技巧
### 1. 查看服务器日志
服务器会输出详细的日志信息:
- 客户端连接
- 消息收发
- 文件路径
- 错误信息
### 2. 浏览器开发者工具
按F12打开开发者工具
- **Console**: 查看JavaScript错误和日志
- **Network**: 查看HTTP请求和WebSocket连接
- **Application**: 查看存储和缓存
### 3. 测试WebSocket连接
在浏览器Console中测试
```javascript
ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => console.log('连接成功');
ws.onerror = (e) => console.error('连接失败', e);
```
### 4. 检查网络连接
```bash
# 测试端口是否可访问
telnet localhost 8080
# 或使用curl
curl http://localhost:8080
```
---
## 获取帮助
如果以上方法都无法解决问题:
1. 运行 `check_setup.sh``check_setup.bat` 检查环境
2. 查看服务器控制台的完整错误信息
3. 查看浏览器开发者工具的Console错误
4. 记录重现问题的步骤
---
## 常见配置
### 修改服务器端口
编辑 `src/server/WebSocketServer.java` 第17行
```java
private static final int PORT = 8080; // 改为其他端口
```
### 修改最大消息长度
编辑 `web/index.html`
```html
<input ... maxlength="500"> <!-- 改为其他值 -->
```
### 启用详细日志
在服务器代码中添加更多System.out.println()语句。

@ -0,0 +1,71 @@
@echo off
REM 检查项目设置脚本 (Windows)
echo =========================================
echo 检查项目设置
echo =========================================
echo.
REM 检查当前目录
echo 当前目录: %CD%
echo.
REM 检查Java
echo 检查Java...
java -version >nul 2>&1
if %errorlevel% equ 0 (
java -version 2>&1 | findstr /C:"version"
echo √ Java已安装
) else (
echo X Java未安装
)
echo.
REM 检查项目结构
echo 检查项目结构:
if exist "src\common" (echo √ src\common\) else (echo X src\common\ ^(缺失^))
if exist "src\server" (echo √ src\server\) else (echo X src\server\ ^(缺失^))
if exist "src\client" (echo √ src\client\) else (echo X src\client\ ^(缺失^))
if exist "web" (echo √ web\) else (echo X web\ ^(缺失^))
echo.
REM 检查Web文件
echo 检查Web文件:
if exist "web\index.html" (echo √ web\index.html) else (echo X web\index.html ^(缺失^))
if exist "web\style.css" (echo √ web\style.css) else (echo X web\style.css ^(缺失^))
if exist "web\app.js" (echo √ web\app.js) else (echo X web\app.js ^(缺失^))
echo.
REM 检查源文件
echo 检查源文件:
if exist "src\server\WebSocketServer.java" (echo √ src\server\WebSocketServer.java) else (echo X src\server\WebSocketServer.java ^(缺失^))
if exist "src\server\WebSocketClient.java" (echo √ src\server\WebSocketClient.java) else (echo X src\server\WebSocketClient.java ^(缺失^))
if exist "src\common\Message.java" (echo √ src\common\Message.java) else (echo X src\common\Message.java ^(缺失^))
if exist "src\common\MessageType.java" (echo √ src\common\MessageType.java) else (echo X src\common\MessageType.java ^(缺失^))
echo.
REM 检查依赖库
echo 检查依赖库:
if exist "lib\gson-2.10.1.jar" (
echo √ lib\gson-2.10.1.jar
) else (
echo X lib\gson-2.10.1.jar ^(缺失^)
echo 运行 download_gson.bat 下载
)
echo.
REM 检查编译输出
if exist "bin" (
echo 编译输出: bin\ ^(已创建^)
) else (
echo 编译输出: bin\ ^(未编译^)
)
echo.
echo =========================================
echo 建议操作:
echo 1. 运行 download_gson.bat 下载依赖
echo 2. 运行 compile_web.bat 编译项目
echo 3. 运行 quick_start.bat 启动服务器
echo =========================================
pause

@ -0,0 +1,85 @@
#!/bin/bash
# 检查项目设置脚本
echo "========================================="
echo " 检查项目设置"
echo "========================================="
echo ""
# 检查当前目录
echo "当前目录: $(pwd)"
echo ""
# 检查Java
echo "检查Java..."
if command -v java &> /dev/null; then
java -version 2>&1 | head -n 1
echo "✓ Java已安装"
else
echo "✗ Java未安装"
fi
echo ""
# 检查项目结构
echo "检查项目结构:"
dirs=("src/common" "src/server" "src/client" "web")
for dir in "${dirs[@]}"; do
if [ -d "$dir" ]; then
echo "$dir/"
else
echo "$dir/ (缺失)"
fi
done
echo ""
# 检查Web文件
echo "检查Web文件:"
files=("web/index.html" "web/style.css" "web/app.js")
for file in "${files[@]}"; do
if [ -f "$file" ]; then
size=$(wc -c < "$file")
echo "$file ($size bytes)"
else
echo "$file (缺失)"
fi
done
echo ""
# 检查源文件
echo "检查源文件:"
src_files=("src/server/WebSocketServer.java" "src/server/WebSocketClient.java" "src/common/Message.java" "src/common/MessageType.java")
for file in "${src_files[@]}"; do
if [ -f "$file" ]; then
echo "$file"
else
echo "$file (缺失)"
fi
done
echo ""
# 检查依赖库
echo "检查依赖库:"
if [ -f "lib/gson-2.10.1.jar" ]; then
size=$(wc -c < "lib/gson-2.10.1.jar")
echo " ✓ lib/gson-2.10.1.jar ($size bytes)"
else
echo " ✗ lib/gson-2.10.1.jar (缺失)"
echo " 运行 ./download_gson.sh 下载"
fi
echo ""
# 检查编译输出
if [ -d "bin" ]; then
class_count=$(find bin -name "*.class" 2>/dev/null | wc -l)
echo "编译输出: bin/ ($class_count 个class文件)"
else
echo "编译输出: bin/ (未编译)"
fi
echo ""
echo "========================================="
echo "建议操作:"
echo "1. 运行 ./download_gson.sh 下载依赖"
echo "2. 运行 ./compile_web.sh 编译项目"
echo "3. 运行 ./quick_start.sh 启动服务器"
echo "========================================="

@ -14,6 +14,14 @@ if %errorlevel% neq 0 (
exit /b 1
)
REM 检查web文件
if not exist "web\index.html" (
echo X 错误: 找不到web\index.html文件
echo 请确保在项目根目录运行此脚本
pause
exit /b 1
)
REM 下载Gson
if not exist "lib\gson-2.10.1.jar" (
echo 下载依赖...

@ -12,6 +12,13 @@ if ! command -v java &> /dev/null; then
exit 1
fi
# 检查web文件
if [ ! -f "web/index.html" ]; then
echo "❌ 错误: 找不到web/index.html文件"
echo "请确保在项目根目录运行此脚本"
exit 1
fi
# 下载Gson
if [ ! -f "lib/gson-2.10.1.jar" ]; then
echo "📦 下载依赖..."

@ -2,5 +2,14 @@
REM Windows启动WebSocket服务器脚本
echo 正在启动WebSocket服务器...
REM 检查web文件
if not exist "web\index.html" (
echo 错误: 找不到web\index.html文件
echo 请确保在项目根目录运行此脚本
pause
exit /b 1
)
cd bin
java -cp ".;..\lib\gson-2.10.1.jar" server.WebSocketServer

@ -2,5 +2,13 @@
# 启动WebSocket服务器脚本
echo "正在启动WebSocket服务器..."
# 检查web文件
if [ ! -f "web/index.html" ]; then
echo "错误: 找不到web/index.html文件"
echo "请确保在项目根目录运行此脚本"
exit 1
fi
cd bin
java -cp ".:../lib/gson-2.10.1.jar" server.WebSocketServer

@ -35,6 +35,10 @@ public class WebSocketServer {
running = true;
System.out.println("WebSocket服务器启动成功监听端口: " + PORT);
System.out.println("Web客户端访问地址: http://localhost:" + PORT);
System.out.println("当前工作目录: " + System.getProperty("user.dir"));
// 检查web文件是否存在
checkWebFiles();
while (running) {
try {
@ -155,8 +159,29 @@ public class WebSocketServer {
}
private String readFile(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
// 尝试多个可能的路径
String[] possiblePaths = {
filePath, // 相对于当前目录
"../" + filePath, // 相对于bin目录
"../../" + filePath, // 更上层
System.getProperty("user.dir") + "/" + filePath // 绝对路径
};
File file = null;
for (String path : possiblePaths) {
File f = new File(path);
if (f.exists()) {
file = f;
System.out.println("找到文件: " + f.getAbsolutePath());
break;
}
}
if (file == null || !file.exists()) {
System.err.println("文件不存在,尝试的路径:");
for (String path : possiblePaths) {
System.err.println(" - " + new File(path).getAbsolutePath());
}
throw new IOException("文件不存在: " + filePath);
}
@ -251,6 +276,34 @@ public class WebSocketServer {
}
}
private void checkWebFiles() {
String[] files = {"web/index.html", "web/style.css", "web/app.js"};
System.out.println("\n检查Web文件:");
for (String filePath : files) {
String[] possiblePaths = {
filePath,
"../" + filePath,
System.getProperty("user.dir") + "/" + filePath
};
boolean found = false;
for (String path : possiblePaths) {
File f = new File(path);
if (f.exists()) {
System.out.println(" ✓ " + filePath + " -> " + f.getAbsolutePath());
found = true;
break;
}
}
if (!found) {
System.err.println(" ✗ " + filePath + " 未找到");
}
}
System.out.println();
}
public static void main(String[] args) {
WebSocketServer server = new WebSocketServer();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {

Loading…
Cancel
Save