当前位置: 首页 > news >正文

手机和电脑怎么传文件?从 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. 拿到 clientSocket4. 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
http://www.gsyq.cn/news/1408216.html

相关文章:

  • 别再手动导数据了!用Kettle Spoon 9.0零代码搞定MySQL到PostgreSQL的定时同步
  • TestNG 常用断言(Assert)
  • C语言程序设计作业题
  • 烟台商户获客适配出租车媒体广告机构排行一览 - 奔跑123
  • CLAD:基于OpenCL的并行自动微分库,加速大规模光束法平差
  • STM32+ESP8266 MQTT实战:从传感器到OneNet物联网平台的数据上云之旅
  • 从点击理由看《痛快活一回》的推荐路径
  • Labview 机器视觉(1)之环境搭建与模块选型
  • 2026 国内 GEO 优化服务排行榜:TOP5 权威评测
  • 告别原生Socket:用Netty 4.1.72重构你的Modbus-RTU服务端(附心跳与设备管理实战)
  • 清单来了:盘点2026年最受欢迎的的AI智能降重工具 - 降AI小能手
  • Mac小白必看:用Easy App Locker给微信、相册加把锁,再也不怕别人借电脑了
  • 温州沙发翻新换皮换布哪家好?匠阁 / 御匠 / 锦修三大品牌联系方式、服务内容及区域全解析 - 卓信营销
  • 从搜索入口看《我想我爱到失眠了》的传播价值
  • STM32MP157实战:手把手教你搞定USB OTG驱动,让开发板变身U盘和声卡
  • 避坑指南:STM32MP157 USB Host驱动配置与Type-C芯片(FUSB302)移植详解
  • 避坑指南:在RV1126的Buildroot系统上适配GC2053摄像头驱动,解决常见编译与拉流问题
  • ping、telnet、ssh远程连接全套详解——连通性测试、端口探测、远程登录
  • 别再用虚拟机了!实测在Windows本地用OpenCDA跑多车协同仿真(附性能对比)
  • Allegro PCB设计:如何快速定位并清理那些烦人的‘过期形状’提示(附个人快捷键设置)
  • 有限重采样下的置信区间修正:Bootstrap与子采样的计算效率与统计可靠性平衡
  • 干扰对齐与人工噪声协同优化:提升多用户中继网络安全性能
  • 软硬件协同优化:基于可定制处理器提升模板计算能效比的工程实践
  • 从黑客松到工程实践:智能体架构如何重塑复杂系统设计
  • 别再单打独斗了!用CrewAI搭建你的第一个多Agent协作项目(附完整代码)
  • 告别盲目升级:在CentOS 7上如何精准安装指定版本的内核(附ELRepo仓库使用详解)
  • 飞腾/鲲鹏服务器上,openEuler 20.03 SP3离线安装Docker 20.10.23保姆级避坑指南
  • PostgreSQL FDW实战:5分钟搞定跨库查询,告别数据孤岛
  • STM32 Modbus从机实战:用EEPROM实现继电器状态断电记忆(附完整工程)
  • Qt6.6.2 LTS国内镜像安装保姆级教程:从下载到配置,避开20G磁盘占用坑