Android 基于TCP的 Socket 编程实现(结合 okio)

前言

两个进程如果要进行通讯最基本的一个前提就是能够唯一的标识一个进程,在本地进程通讯中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地是唯一的,网络中两个进程 PID 冲突几率很大,这时我们就需要通过其他手段来唯一标识网络中的进程了,我们知道 IP 层的 ip 地址可以唯一标示主机,而 TCP 层协议和端口号结合就可以唯一标示主机的一个进程了。

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

这里写图片描述

相关类

这里提到的 Socket 为广义上的 Socket 编程,它可以基于 TCP 或者 UDP 实现,Java 为 Socket 编程封装了几个重要的类,如下:

  • Socket (TCP)

Socket 类实现了一个客户端 Socket,作为两台机器通信的终端,默认采用的传输层协议为 TCP 可靠传输协议。Socket 类除了构造函数返回一个 socket 外,还提供了 connect , getOutputStream, getInputStream 和 close 方法。connect 方法用于请求一个 socket 连接,getOutputStream 用于获得写 socket的输出流,getInputStream 用于获得读 socket 的输入流,close 方法用于关闭一个流。

  • DatagramSocket (UDP)

DatagramSocket 类实现了一个发送和接收数据报的 socket,传输层协议使用 UDP,不能保证数据报的可靠传输。DataGramSocket 主要有 send, receive 和 close 三个方法。send 用于发送一个数据报,Java 提供了 DatagramPacket 对象用来表达一个数据报。receive 用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时。close 是关闭一个 socket。

  • ServerSocket

ServerSocket 类实现了一个服务器 socket,一个服务器 socke t等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者一个结果。ServerSocket 提供了 bind、accept 和 close 三个方法。bind 方法为ServerSocket 绑定一个IP地址和端口,并开始监听该端口。accept 方法为 ServerSocket 接受请求并返回一个 Socket 对象,accept 方法调用后,将一直阻塞直到有请求到达。close 方法关闭一个 ServerSocket 对象。

  • SocketAddress

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

  • InetSocketAddress

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

  • DatagramPacket(UDP)

DatagramSocket 是面向数据报 socket 通信的一个可选通道。数据报通道不是对网络数据报 socket 通信的完全抽象。socket通信的控制由DatagramSocket 对象实现。DatagramPacket 需要与 DatagramSocket 配合使用才能完成基于数据报的 socket 通信。

基于TCP的 Socket

基于 TCP 的 Socket可以实现客户端—服务器间的双向实时通信。上面提到的 java.net 包中定义的两个类 Socket 和 ServerSocket,分别用来实现双向连接的 client 和 server 端。

这里写图片描述

具体的实现步骤在我另外一篇循序渐进Socket网络编程(多客户端、信息共享、文件传输)中有很详细的描述,接下来看 Android 端如何实现基于 TCP 的 Socket 连接。

实现

客户端连接:
这里写图片描述

  • 15
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
OkHttp 是一个非常流行的 HTTP 客户端库,它支持 HTTP/2 和 SPDY,提供了一个简单、易用的 API,能够轻松地完成网络请求。同时,OkHttp 还提供了对 WebSocket 的支持,可以用来编写基于 WebSocket 的应用程序。 以下是一个使用 OkHttp 实现 Socket 通信的简单示例: ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.WebSocket; import okhttp3.WebSocketListener; import okio.ByteString; public class SocketExample { public static void main(String[] args) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("ws://echo.websocket.org") .build(); WebSocket socket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("Hello, World!"); webSocket.send(ByteString.decodeHex("deadbeef")); } @Override public void onMessage(WebSocket webSocket, String text) { System.out.println("Received message: " + text); } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { System.out.println("Received bytes: " + bytes.hex()); } @Override public void onClosing(WebSocket webSocket, int code, String reason) { webSocket.close(1000, null); System.out.println("Closing: " + code + " " + reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { t.printStackTrace(); } }); } } ``` 在这个示例中,我们首先创建了一个 OkHttpClient 对象,然后创建了一个 Request 对象,指定了 WebSocketURL。接着,我们调用 OkHttpClient 的 newWebSocket 方法,把 Request 对象和一个 WebSocketListener 对象传递进去。在 WebSocketListener 中,我们实现了 onOpen、onMessage、onClosing 和 onFailure 四个方法,分别处理 WebSocket 打开、接收消息、关闭和出错的情况。 在 onOpen 方法中,我们调用 WebSocket 的 send 方法发送消息,可以是字符串或二进制数据。在 onMessage 方法中,我们打印接收到的消息,可以是字符串或二进制数据。在 onClosing 方法中,我们手动关闭 WebSocket 连接。在 onFailure 方法中,我们打印出异常信息。 需要注意的是,这个示例只是一个简单的演示,实际应用中,需要根据具体的需求来实现 WebSocket 的逻辑。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值