手机和电脑怎么传文件?从 TCP 到 UDP,手写一个 Android Socket 聊天 App(附完整代码)

📅 2026/7/22 18:36:48 👁️ 阅读次数 📝 编程学习
手机和电脑怎么传文件?从 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 通信流程:

Client 端

Server 端

TCP 三次握手

双向收发

1. new ServerSocket(port)

2. serverSocket.accept()
阻塞等待连接

3. 拿到 clientSocket

4. InputStream 收数据
OutputStream 发数据

5. socket.close()

1. new Socket(ip, port)

2. 连接成功

3. OutputStream 发数据
InputStream 收数据

4. socket.close()

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<