diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png b/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png new file mode 100644 index 0000000000000000000000000000000000000000..45647602d435c7f31e6f6431ee862bad7f76fea9 Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe2a127ce0932449577fccf47b65099faeefdf Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg deleted file mode 100644 index 2c84dabc7cc228121eaf4311675b0259a240795f..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg deleted file mode 100644 index 7ec6f65fe66cfe302bb5acfcedaf904ad07a9e6a..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg deleted file mode 100644 index 940272b8ef2f5ccc18d26e022f8b02f6a90d3774..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg deleted file mode 100644 index 7442f2cc0d0463103b1c30ccbfba4a4b119b4af1..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg deleted file mode 100644 index bbbcfdd07f513ac3313f5e2e0a82086702ad9748..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg deleted file mode 100644 index e6a6be3adc45e2e85806d93aceb319b218fbeb58..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg deleted file mode 100644 index 01d78635e6af1079fc35f1dea97b7b7c18b2eb6b..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..513d870ad8946658bcedc2cdcb4bf096a42ef399 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f44eabdd18c9a9d3e52a4fe0b59c14669fdd6352 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d93c15e64706c3f1fd6842c946253f9093d0d0c Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..da9914445e775ab6aae8a3b2b38fcc3477ed393c Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..20eacf5ea3837b5daafb5755eef6a459ad376be6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..01b43cc768f6703d3b1e54f44b7cc3a1aa9cda33 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4646739464a740ae9bf90c8fb7187cbec65db6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c524185af736bb2138c5ee76236883f91e93709b Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d41386fccd82b6641eb4c34bd99b01d4c8a564 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..884981ae1fb0ac2efb7ead8ebce1db6979001c3a Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png differ diff --git a/docs/sbs/zh/sbs/socket.md b/docs/sbs/zh/sbs/socket.md index e5b153cf0da6e8edae610b4cd7a7edf456b7a09a..9a05e1411a446d643a2cf2555b32975e396dacde 100644 --- a/docs/sbs/zh/sbs/socket.md +++ b/docs/sbs/zh/sbs/socket.md @@ -1,544 +1,124 @@ -### Socket应用 开发指导 +## 修订历史 -#### Socket概述 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | -------- | ------- | ---------------- | +| 1.0 | 2021-4-7 | Grey.Tu | 初版,Socket使用 | -​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 - -​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 - -**Socket的应用** - -​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 - -#### QuecPython Socket API详解 - -​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ -读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 - -​ QuecPython类库中通过usocket实现Socket功能,usocket 模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集,更多信息请参阅CPython文档:socket。其中usocket对Socket功能的具体流程及实现的相关API介绍如下。 - -**usocket.socket** - -​ 该函数用于服务端或客户端创建一个Socket对象。 - -函数原型 - -``` -sock=usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -``` - -参数 - -usocket.AF_INET: -网络协议,IPv - -usocket.SOCK_STREAM: -对应TCP的流式Socket。更多常量定义详见Quectel QuecPython 类库API说明。 - -返回值 - -无。 - -**usock.getaddrinfo** - -​ 该函数用于将主机域名(host)和端口(port)转换为用于创建套接字的 5 元组序列,元组结构如下: -(family, type, proto, canonname, sockaddr) - -函数原型 - -``` -usocket.getaddrinfo(host, port) -``` - -参数 - -host: -主机域名。 - -port: -端口。 -返回值 -无。 +## Socket开发指导 +本文主要介绍Socket套接字,读者通过对本文的了解,可以学习Socket套接字接口的基本操作。 -**sock.bind** -​ 该函数用于将Socket对象和服务端IP:端口绑定。由于TCP口是动态的,客户端无需进行绑定。使用该函数之前,Socket必须未进行绑定。 +## Socket概述 -函数原型 +### Socket介绍 -``` -sock.bind(address) -``` - -参数 - -address: -由地址端口号组成的列表或者元组。 - -返回值 +​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 -无。 +​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 +​ Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 +![Quectel_sbs_Socket_relation_2](media/Quectel_sbs_Socket_relation_2.png) -**sock.listen** +### Socket过程 -​ 该函数允许服务端接受Socket连接,可指定最大连接数。 +​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ +读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 -函数原型 +![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) -``` -sock.listen(backlog) -``` +### **Socket的应用** -参数 +​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 -backlog: -接受的最大Socket连接数,至少为 0 。 +## QuecPython Socket API介绍 -返回值 +具体的API详解请参考[usocket - socket模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=usocket-socket模块) -无。 +## Socket功能实现 +​ 在进行此功能测试之前需了解QuecPython基本操作,有关基本操作方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。本章节将通过介绍在QuecPython上创建一个TCP客户端连接服务器为例给大家介绍Socket功能。 +​ 由于模块是作为TCP客户端去连接服务器,便需要在连接前有提供连接服务器。在此我们主要介绍模块的Socket功能,有关服务器部分内容大家另外了解。这边我们介绍较为简单的一种测试方式,使用网络资源:[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)进行测试。[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)提供了连接服务器;数据发送;数据接收;断开连接等功能。 -**sock.accept** +### 交互实验 -​ 该函数用于服务端接受客户端连接请求。 +按照[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,进行以下操作。 -函数原型 +#### 导入usocket模块,创建一个Socket实例: -``` -(conn, addres) = sock.accept() +```python +import usocket +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ``` -参数 +![sbs_socket_picture_1](media/sbs_socket_picture_1.png) -无。 +#### 打开[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)查看需要连接的IP地址及端口号: -返回值 +![sbs_socket_picture_2](media/sbs_socket_picture_2.png)注:由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 -返回元组,包含新的Socket和客户端地址,形式为:(conn, address)。 +#### 建立与服务端的连接: -conn: -新的Socket对象,用来发送和接收数据。 - -address: -连接到服务器的客户端地址。 - - - -**sock.connect** - -​ 客户端使用该函数连接到指定地址的服务器。 - -函数原型 - -``` -sock.connect(address) +```python +sock.connect(('122.114.122.174', 34187)) ``` -参数 - -address: -连接到客户端的服务端地址。 - -返回值 - -无。 +![sbs_socket_picture_3](media/sbs_socket_picture_3.png) +注: 1. API参数的IP地址与端口必须为服务器的IP地址与端口。 +​ 2. 建立连接的API参数必须用“()”括起来,这是由于底层会将IP地址与端口号当一个参数传入。 -**2.3.7. sock.recv** +![sbs_socket_picture_4](media/sbs_socket_picture_4.png)发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 -​ 该函数用于接受客户端或服务端发送的数据。 +#### 模块上传数据: -函数原型 - -``` -recv_data = sock.recv(bufsize) +```python +>>> ret=sock.send('1234567890\r\n') +>>> print('send %d bytes' % ret) +send 12 bytes ``` -参数 +![sbs_socket_picture_5](media/sbs_socket_picture_5.png) -bufsize: -一次接收的最大数据量。 +![sbs_socket_picture_6](media/sbs_socket_picture_6.png)模块上传数据后可以在服务器上看到模块上传的数据。 -返回值 +#### 服务器下发数据: -返回值是一个字节对象,表示接收到的数据。 +![sbs_socket_picture_7](media/sbs_socket_picture_7.png) +服务器下发数据后模块端便可以读取数据,读取指令与读取效果如下: - -**sock.send** - -​ 该函数用于发送数据到服务端或客户端。 - -函数原型 - -``` -sock.send(send_data.encode("utf8")) +```python +>>> data=sock.recv(1024) +>>> print('recv %s bytes:' % len(data)) +recv 10 bytes: +>>> print(data.decode()) +0123456789 ``` -参数 - -send_data: -表示要发送的数据。 - -返回值 +![sbs_socket_picture_8](media/sbs_socket_picture_8.png) -返回实际发送的字节数。 +#### 断开连接: -备注 - -​ TCP协议的Socket是基于字节流的,通过Socket发送数据之前,需先使用encode("utf8")对数据进行编码,其中"utf8"为编码方式。 - - - -**sock.close** - -​ 该函数用于关闭Socket通信。 - -函数原型 - -``` +```python sock.close() ``` -参数 - -无。 - -返回值 - -无。 - - - -**sock.read** - -​ 该函数用于从Socket中读取size字节数据,如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束。 - -函数原型 - -``` -socket.read([ size ]) -``` - -参数 - -[ size ]: -要读取的字节数。 - -返回值 - -字节对象。 - - - -**sock.readinto** - -​ 该函数用于将字节读取到缓冲区中。 - -函数原型 - -``` -sock.readinto(buf [ , nbytes ]) -``` - -参数 - -buf: -存放读取字节的缓冲区。 - -nbytes: -读取的字节数。 - -返回值 - -实际读取的字节数。 - - - -**sock.readline** - -​ 该函数用于按行读取数据,遇到换行符结束。 - -函数原型 - -``` -sock.readline() -``` - -参数 - -无。 - -返回值 - -返回读取的数据行。 - - - -**sock.write** - -​ 该函数用于向缓存区写入数据。 - -函数原型 - -``` -sock.write(buf) -``` - -参数 - -buf: -写入缓冲区的数据。 - -返回值 - -返回实际写入的字节数。 - - - -**sock.sendall** - -​ 该函数用于将所有数据都发送到Socket。 - -函数原型 - -``` -sock.sendall(bytes) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -返回值 - -无。 - - - -**sock.sendto** - -​ 该函数用于将数据发送到Socket。该Socket不应连接到远程Socket,因为目标Socket是由address指定的。 - -函数原型 - -``` -sock.sendto(bytes, address) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -address: - -包含地址和端口号的元组或列表。 - -返回值 - -无。 - - - -**sock.recvfrom** - -​ 该函数用于从Socket接收数据。返回一个元组,包含字节对象和地址。 - -函数原型 - -``` -socket.recvfrom(bufsize) -``` - -参数 - -bufsize: -接收的缓存数据。 - -返回值 - -返回一个元组,包含字节对象和地址,形式为:(bytes, address)。 - -bytes: -接收数据的字节对象。 - -address: - -发送数据的Socket的地址。 - - - -**sock.setsockopt** - -​ 该函数用于设置socket选项的值。 - -函数原型 - -``` -socket.setsockopt(level, optname, value) -``` - -参数 - -level: -socket选项级别。 - -optname: -socket选项。 - -value: -既可以是一个整数,也可以是一个表示缓冲区的bytes类对象。 - -返回值 - -无。 - - - -**sock.setblocking** - -​ 该函数用于设置Socket为阻塞模式或者非阻塞模式。如果flag为false,则将Socket设置为非阻塞模式,否则设置为阻塞模式。 - -函数原型 - -``` -socket.setblocking(flag) -``` - -参数 - -flag: -Ture 阻塞模式 -False 非阻塞模式 - -返回值 - -无。 - - - -**sock.settimeout** - -​ 该函数用于设置Socket的超时时间,单位:秒。 - -函数原型 - -``` -socket.settimeout(value) -``` - -参数 - -value: - 可以是秒的非负浮点数,也可以是None。如果将其设置为一个非零值,OSError在该操作完成之前已超过超时时间值,则随后的Socket操作将引发异常;如果将其设置为零,则将Socket置于非阻塞模式。如果未指定该值,则Socket将处于阻塞模式。 - -返回值 - -无。 - - - -**Socket.makefile** - -​ 该函数用于生成一个文件与socket对象关联,之后即可像读取普通文件一样使用socket。(普通文件的操作有open和write等。) - -函数原型 - -``` -socket.makefile(mode='rb')、 -``` - -参数 - -mode: -二进制模式(rb和wb)。 - -返回值 - -返回与套接字关联的文件对象。 - - - -#### Socket功能实现 - -​ 为了使用户更清楚的了解Socket功能,本章节提供了一个在QuecPython上创建Socket的实例,即模拟浏览器访问web服务器获取网页内容。首先在Xshell中,连接模块主串口,进入交互界面,然后按如下步骤实现Socket功能: - -1. 导入usocket模块,创建一个Socket实例: - - ``` - import usocket - sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) - ``` - - ![](media/sbs_socket_picture1.jpg) - -2. 解析域名 - - ``` - sockaddr=usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] - ``` - - ​ 将主机域名(host)和端口(port)转换为用于创建Socket的 5 元组序列,元组结构如下: - -(family, type, proto, canonname, sockaddr) - -![](media/sbs_socket_picture2.jpg) - -3. 建立与服务端的连接: - - ``` - sock.connect(sockaddr) - ``` - -![](media/sbs_socket_picture3.jpg) - -4. 向服务端发送消息: - - ``` - ret=sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding:deflate\r\nConnection: keep-alive\r\n\r\n') - print('send %d bytes' % ret) - ``` - - ![](media/sbs_socket_picture4.jpg) - -5. 接收服务端的消息: - - ``` - data=sock.recv(1024) - print('recv %s bytes:' % len(data)) - print(data.decode()) - ``` - - ![](media/sbs_socket_picture5.jpg) - - ​ 服务端消息接收完成后,可在浏览器上发起请求,验证返回消息是否与Socket接收的消息一致,如下所示: - - ![](media/sbs_socket_picture6.jpg) - -6. 关闭连接: - - ``` - sock.close() - ``` +![sbs_socket_picture_9](media/sbs_socket_picture_9.png) - ![](media/sbs_socket_picture7.jpg) +执行断开指令后服务器端的设备将会下线,如下图: ![sbs_socket_picture_10](media/sbs_socket_picture_10.png) - ​ 以上部分代码可见于移远通信提供的SDK工具包中,路径为moudles/socket/example_socket.py,也可通过example模块来执行该脚本文件。 +至此,模块做TCP客户端连接服务器完毕。 - +### 代码实验 - usocket服务端功能实现代码如下图: +usocket服务端功能实现代码如下图: ```python #导入usocket模块 @@ -564,7 +144,7 @@ while True: break ``` -#### 附录 +## 附录术语缩写 表 1 :术语缩写