手机和电脑怎么传文件?从 TCP 到 UDP,手写一个 Android Socket 聊天 App(附完整代码)
手机和电脑怎么传文件?从 TCP 到 UDP,手写一个 Android Socket 聊天 App(附完整代码)
目录
- 一、Android 上为什么要用 Socket?
- 二、TCP Socket 基础
- 2.1 Client 端
- 2.2 Server 端
- 三、Android 开发 Socket 的特殊点
- 四、实战:局域网聊天 App
- 五、UDP Socket 通信
- 六、文件传输实战
- 七、WiFi P2P(WiFi Direct)Socket
- 八、常见踩坑记录
- 九、总结与选型
一、Android 上为什么要用 Socket?
HTTP 接口是 Android 和服务器通信的主流方案——发个请求,拿个 JSON,够用了。
但有些场景 HTTP 就不行了:
- 实时聊天:消息一来就得立刻推过去,HTTP 轮询太费电
- 文件传输:传大文件,HTTP 有头有尾的开销太大
- 局域网设备通信:手机和电脑在同一个 WiFi 下,直接用 Socket 比走服务器快得多
- IoT 控制:智能家居设备很多走 TCP Socket,手机 App 必须能连
Android 用的是标准 Java Socket API(java.net.Socket/java.net.ServerSocket),外加一条铁律——不能在主线程做网络操作。
// ❌ 主线程直接连 —— 必崩newThread(()->{Socketsocket=newSocket("192.168.1.100",8888);// NetworkOnMainThreadException}).start();// ✓ 开子线程Socketsocket=newSocket("192.168.1.100",8888);// 没问题二、TCP Socket 基础
TCP 是有连接的、可靠的。一次 Socket 通信分为 Client(发起方)和 Server(监听方)。
Android Socket 通信流程:
Server 端的
accept()是阻塞的——没客户端连过来,代码就卡在那等。所以 Server 必须放子线程里跑。
2.1 Client 端
publicclassTcpClient{privateSocketsocket;privatePrintWriterwriter;privateBufferedReaderreader;publicvoidconnect(Stringip,intport){newThread(()->{try{// 1. 创建 Socket,发起连接socket=newSocket(ip,port);// 2. 获取输入输出流writer=newPrintWriter(newOutputStreamWriter(socket.getOutputStream()),true);reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));// 3. 发送数据writer.println("Hello, Server!");// 4. 接收数据(阻塞)Stringresponse=reader.readLine();Log.d("TcpClient","收到: "+response);}catch(IOExceptione){Log.e("TcpClient","连接失败",e);}}).start();}publicvoidsend(Stringmsg){if(writer!=null){newThread(()->writer.println(msg)).start();}}publicvoidclose(){try{if(socket!=null)socket.close();}catch(IOExceptione){e.printStackTrace();}}}2.2 Server 端
publicclass<