# SocketDemo **Repository Path**: ZhongshengAI/socket-demo ## Basic Information - **Project Name**: SocketDemo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-17 - **Last Updated**: 2025-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android和C/C++ Socket通信Demo 这是一个演示Android客户端与C/C++服务器之间通过Socket进行TCP和UDP通信的完整示例项目。 ## 项目结构 ``` SocketDemo/ ├── android-client/ # Android客户端项目 │ ├── app/ │ │ ├── src/main/ │ │ │ ├── java/com/socketdemo/client/ │ │ │ │ └── MainActivity.kt # Kotlin主界面 │ │ │ ├── cpp/ │ │ │ │ ├── socket_client.cpp # JNI C++实现 │ │ │ │ ├── socket_client.h │ │ │ │ └── CMakeLists.txt │ │ │ └── res/ # 资源文件 │ │ └── build.gradle.kts │ └── build.gradle.kts └── cpp-server/ # C/C++服务器项目 ├── src/ │ ├── main.cpp # 主程序入口 │ ├── tcp_server.cpp # TCP服务器实现 │ ├── tcp_server.h │ ├── udp_server.cpp # UDP服务器实现 │ ├── udp_server.h │ └── server_config.h # 配置结构 ├── CMakeLists.txt ├── build.sh # Linux/macOS编译脚本 └── build.bat # Windows编译脚本 ``` ## 功能特性 ### Android客户端 - ✅ 支持TCP和UDP协议切换 - ✅ 可配置服务器IP和端口 - ✅ 实时消息发送和接收 - ✅ 连接状态显示和日志记录 - ✅ 配置信息自动保存(SharedPreferences) - ✅ 使用JNI调用C/C++底层Socket实现 ### C/C++服务器 - ✅ 支持TCP和UDP服务器模式 - ✅ 命令行参数配置(协议、IP、端口) - ✅ 多客户端并发处理(TCP模式) - ✅ 消息回显功能 - ✅ 跨平台支持(Windows/Linux) ## 编译和运行 ### Android客户端 #### 前置要求 - Android Studio Hedgehog (2023.1.1) 或更高版本 - Android SDK (API 24+) - Android NDK (通过Android Studio安装) #### 编译步骤 1. 使用Android Studio打开 `android-client` 目录 2. 等待Gradle同步完成 3. 连接Android设备或启动模拟器 4. 点击运行按钮或使用快捷键 `Shift+F10` #### 使用说明 1. 选择协议类型(TCP或UDP) 2. 输入服务器IP地址(例如:`192.168.1.100`) 3. 输入端口号(例如:`8888`) 4. 点击"连接"按钮 5. 连接成功后,输入消息并点击"发送" 6. 接收到的消息会显示在日志区域 ### C/C++服务器 **详细编译和运行说明请查看:[BUILD_AND_RUN.md](cpp-server/BUILD_AND_RUN.md)** #### 快速开始 **Windows本地编译:** ```batch cd cpp-server build_windows.bat # 运行: build-windows\Release\socket_server.exe --protocol tcp --port 8888 ``` **Android交叉编译:** ```bash # Linux/macOS cd cpp-server export ANDROID_NDK_HOME=/path/to/ndk ./build_android.sh arm64-v8a # Windows cd cpp-server set ANDROID_NDK_HOME=C:\path\to\ndk build_android.bat arm64-v8a ``` **在Android设备上运行:** ```bash # 使用自动化脚本(推荐) ./run_android.sh arm64-v8a --protocol tcp --port 8888 # 或手动操作 adb push build-android-arm64-v8a/socket_server /data/local/tmp/ adb shell chmod 755 /data/local/tmp/socket_server adb shell /data/local/tmp/socket_server --protocol tcp --ip 0.0.0.0 --port 8888 ``` #### 基本运行命令 **TCP模式:** ```bash # Linux/macOS ./build/socket_server --protocol tcp --ip 0.0.0.0 --port 8888 # Windows build-windows\Release\socket_server.exe --protocol tcp --ip 0.0.0.0 --port 8888 ``` **UDP模式:** ```bash # Linux/macOS ./build/socket_server --protocol udp --ip 0.0.0.0 --port 8888 # Windows build-windows\Release\socket_server.exe --protocol udp --ip 0.0.0.0 --port 8888 ``` **查看帮助:** ```bash socket_server --help ``` ## 使用示例 ### 场景1:TCP通信 1. **启动TCP服务器:** ```bash cd cpp-server ./build/socket_server --protocol tcp --ip 0.0.0.0 --port 8888 ``` 2. **Android客户端连接:** - 选择"TCP"协议 - 输入服务器IP(如果服务器在同一网络,使用服务器IP;如果在同一设备,使用`127.0.0.1`) - 输入端口`8888` - 点击"连接" 3. **发送消息:** - 在消息输入框输入文本 - 点击"发送" - 服务器会回显消息,显示在日志中 ### 场景2:UDP通信 1. **启动UDP服务器:** ```bash cd cpp-server ./build/socket_server --protocol udp --ip 0.0.0.0 --port 8888 ``` 2. **Android客户端连接:** - 选择"UDP"协议 - 输入服务器IP和端口 - 点击"连接" 3. **发送消息:** - UDP是无连接协议,直接发送消息即可 - 服务器会回显消息 ## 技术实现 ### Android端JNI接口 ```cpp // 初始化Socket nativeInitSocket(protocol: Int, ip: String, port: Int): Boolean // 连接服务器 nativeConnect(): Boolean // 发送消息 nativeSend(message: String): Boolean // 接收消息 nativeReceive(): String? // 断开连接 nativeDisconnect() // 清理资源 nativeCleanup() // 检查连接状态 nativeIsConnected(): Boolean ``` ### 服务器命令行参数 - `--protocol `: 协议类型(默认:tcp) - `--ip `: 监听IP地址(默认:0.0.0.0,表示所有网络接口) - `--port <端口>`: 监听端口(默认:8888) - `--help`: 显示帮助信息 ## 注意事项 1. **网络权限:** Android应用需要在`AndroidManifest.xml`中声明`INTERNET`权限(已包含) 2. **防火墙设置:** 确保服务器防火墙允许指定端口的入站连接 3. **IP地址配置:** - 同一设备测试:使用`127.0.0.1`或`localhost` - 同一网络测试:使用服务器的局域网IP(如`192.168.1.100`) - 确保Android设备和服务器在同一网络 4. **端口占用:** 如果端口被占用,修改端口号或关闭占用该端口的程序 5. **UDP特性:** UDP是无连接协议,不需要建立连接即可发送数据 ## 故障排查 ### Android客户端无法连接 - 检查服务器是否正在运行 - 确认IP地址和端口号正确 - 检查网络连接 - 查看Android Logcat中的错误信息 ### 服务器启动失败 - 检查端口是否被占用:`netstat -an | grep <端口>`(Linux)或 `netstat -an | findstr <端口>`(Windows) - 确认有足够的权限绑定端口(某些系统需要root权限绑定1024以下端口) - 检查防火墙设置 ### 消息发送失败 - 确认连接状态(TCP模式) - 检查网络连接 - 查看服务器日志输出 ## 开发环境 - **Android开发:** Android Studio 2023.1.1+ - **C++开发:** CMake 3.10+, C++17编译器 - **平台支持:** Windows 10+, Linux, macOS, Android 7.0+ (API 24+) ## 许可证 本项目仅供学习和演示使用。 ## 贡献 欢迎提交Issue和Pull Request!