首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 基于 TCP的Socket 编程实现

两个进程进行通讯最基本的前提是能唯一标识一个进程,在本地进程通讯中可以使用 PID 来唯一标识一个进程,但 PID 在本地是唯一的,网络中两个进程 PID 冲突几率很大,这就要通过其他手段来唯一标识进程了,IP 层的 ip 地址可以唯一标示主机,再结合 TCP 端口号就可以唯一标示某个主机的进程。

唯一标示网络中的进程后,就可以利用 Socket 通信了,到底什么是 Socket 呢?我们经常把 Socket 翻译为套接字,Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信。

Socket 编程,可以基于 TCP 或 UDP 实现,Java 为 Socket 编程封装了几个重要的类,我们来认识一下:

Socket (TCP)

Socket 类实现了一个客户端 Socket,作为两台机器通信的终端,默认采用的传输层协议为可靠的 TCP 传输协议,主要方法如下:

connect() 用于请求一个 socket 连接

getOutputStream 用于获得写 socket 的输出流

getInputStream 用于获得读 socket 的输入流

close 用于关闭一个流。

DatagramSocket (UDP)

DatagramSocket 类实现了一个发送和接收数据报的 socket,传输层协议使用 UDP,不能保证数据报的可靠传输,主要方法如下:

send 用于发送一个数据报,Java 提供了 DatagramPacket 对象用来表达一个数据报

receive 用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时

close 关闭一个 socket。

ServerSocket

ServerSocket 类实现了一个服务端 socket,服务端 socket 等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者结果,主要方法如下:

bind 方法为 ServerSocket 绑定一个 IP 地址和端口,并开始监听该端口

accept 方法为 ServerSocket 接受请求并返回一个 Socket 对象,accept 方法调用后,将一直阻塞直到有请求到达

close 方法关闭一个 ServerSocket 对象。

SocketAddress

SocketAddress 提供了一个 socket 地址,不关心传输层协议。这是一个虚类,由子类来具体实现功能、绑定传输协议。它提供了一个不可变的对象,被 socket 用来绑定、连接或者返回数值。

InetSocketAddress

InetSocketAddress 实现了 IP 地址的 SocketAddress,也就是有 IP 地址和端口号表达 Socket 地址。如果不制定具体的 IP 地址和端口号,那么 IP 地址默认为本机地址,端口号随机选择一个。

DatagramPacket(UDP)

DatagramPacket 表示一个数据包,需要与 DatagramSocket 配合使用才能完成基于数据报的 socket 通信。

代码示例

来看一个简单的 TCP 通信示例,加深对 Socket 编程的了解。

服务端

服务端通过 ServerSocket 实现一个 socket,等待客户端请求:

当 accept 到请求后,启动了一个子线程去处理,处理前先要初始化 IO 流:

在任务中接收处理客户端发来的信息,我们假定 “0” 表示客户端主动请求断开:

客户端

客户端知道服务端 IP 地址及端口号后,通过 Socket 请求建立连接:

发送和接收数据跟服务端一样,分别通过 PrintWriter 和 BufferedReader 来实现。至此,客户端和服务端就能愉快的进行全双工通信了。

最后附一张图来总结:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210122A01SOG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券