头条资讯 - 为您提供最新最全的新闻资讯,每日实时更新

Android 基于 TCP的Socket 编程实现

科技数码 Android面试官

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

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

Android 基于 TCP的Socket 编程实现

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 来实现。至此,客户端和服务端就能愉快的进行全双工通信了。

最后附一张图来总结:

Android 基于 TCP的Socket 编程实现

转载请超链接注明:头条资讯 » Android 基于 TCP的Socket 编程实现
免责声明
    :非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件24小时内删除。
加载中...