type
status
date
slug
summary
tags
category
icon
password
文章前言:本文主要介绍TCP连接的方法。
一、TCP简介
传输控制协议(TCP,TransmissionControl Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP旨在适应支持多网络应用的分层协议层次结构,互连的计算机通信网络中成对的应用程序进程之间能够依靠TCP提供可靠的通信服务来传输字节流。TCP支持双向数据流,应用程序也可以仅单向发送数据。在主机之间,TCP使用端口号标识应用程序服务并且可以多路传输数据流。
二、TCP通讯的常用方法
鸿蒙封装的TCP操作类位于模块Socket:@ohos.net.socket (Socket连接)
import { socket } from '@kit.NetworkKit';
下面我们来介绍一下在学习TCP连接中,我们需要学习的操作方法:
1.constructTCPSocketInstance(): TCPSocket
创建一个TCPSocket对象。
2.bind(address: NetAddress): Promise<void>
绑定IP地址和端口,端口可以指定为0由系统随机分配或指定为其它非0端口。使用Promise方法作为异步方法。
bind的IP为'localhost'或'127.0.0.1'时,只允许本地回环接口的连接,即服务端和客户端运行在同一台机器上。
3.connect(options: TCPConnectOptions): Promise<void>
连接到指定的IP地址和端口。
使用promise方法作为异步方法。
参数options包含了连接的地址address和连接超时时间timeout,其中address是必选的,timeout是可选的。
在没有执行tcp.bind的情况下,也可以直接调用该接口完成与TCP服务端的连接。
4.send(options: TCPSendOptions): Promise<void>
通过TCPSocket连接发送数据,参数options包括要发送的数据data和字符编码encoding,其中data是必选的,encoding是可选的,默认使为utf-8编码,使用Promise方式作为异步方法。
connect方法调用成功后,才可调用此方法。该接口为耗时操作,请在Worker线程或taskpool线程调用该接口。
5.on(type: 'connect', callback: Callback<TCPSocketConnection>): void
订阅TCPSocketServer的连接事件。使用callback方式作为异步方法。
listen方法调用成功后,才可调用此方法。
on(type: 'message', callback: Callback<{message: ArrayBuffer, remoteInfo: SocketRemoteInfo}>): void
订阅TCPSocket连接的接收消息事件,当套接字接收到消息时触发该事件,其中message表示接收到的消息,remoteInfo是发送方信息;使用callback方式作为异步方法。
6.close(): Promise<void>
关闭TCPSocket连接。使用Promise方式作为异步方法。
7.getRemoteAddress(): Promise<NetAddress>
获取对端Socket地址。使用Promise方式作为异步方法。
connect方法调用成功后,才可调用此方法。
三、TCP客户端通讯示例
为演示TCP通讯的方式,本示例实现了一个使用TCP协议发送、接收消息的功能,运行后的初始界面如下所示:

本示例的实现思路是这样的,首先把套接字绑定到本地的给定端口上,然后再连接到指定的服务端,最后发送消息给服务端,因为TCP是面向连接的协议,所以,本示例默认情况下连接和发送按钮都是不可用的,在绑定成功后才可以使用连接按钮,在成功连接带服务端后才可以使用发送按钮。
下面详细介绍创建该应用的步骤。
步骤1:创建Empty Ability项目。
步骤2:在module.json5配置文件加上对权限的声明:
这里分别添加了访问互联网和访问WIFI信息的权限。
步骤3:在Index.ets文件里添加如下的代码:
步骤4:编译运行,可以使用模拟器或者真机。
步骤5:配置本地端口和服务端地址,这里为了模拟服务端,使用nc命令在服务器监听9999端口,命令如下:
当然,也可以根据自己需要选择其他合适的TCP服务端。例如使用网络连接助手将本机视为服务端。
注意:APP与电脑需要连接同一个WIFI。



连接上服务端后,客户端发送消息“服务端,你好啊!”
然后服务端回复:“客户端,你好!”,客户端截图如下所示:

📎 参考文章
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/1d5c7b13-c6a7-804e-bc7d-c461afaed8c2
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts