加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Python 绝技 —— TCP 服务器与客户端

发布时间:2019-08-29 16:53:06 所属栏目:业界 来源:ciphersaw
导读:0x00 媒介 本文先先容因特网的焦点协议 TCP ,再以 Python 的 socket 模块为例先容收集套接字,最后给出 TCP 处事器与客户端的 Python 剧本,并演示两者之间的通讯进程。 0x01 TCP 协议 TCP(Transmission Control Protocol,传输节制协议)是一种面向毗连、

listen() 函数用于 TCP 处事器开启套接字的监听成果。函数原型如下:

  1. socket.listen([backlog]) 
  • backlog 可选参数代表套接字在拒绝新毗连之前,操纵体系可以挂起的最大毗连数。backlog 参数一样平常配置为 5,若未配置,体系会为其自动配置一个公道的值。

connect() 函数

connect() 函数用于 TCP 客户端向 TCP 处事器提倡毗连哀求。函数原型如下:

  1. socket.accept() 

address 参数代表套接字要毗连的地点,其名目取决于套接字的 family 参数。若 family 参数为 AF_INET,则 address 参数暗示为二元组 (host, port),个中 host 是用字符串暗示的主机地点,port 是用整型暗示的端标语。

accept() 函数

accept() 函数用于 TCP 处事器接管 TCP 客户端的毗连哀求。函数原型如下:

  1. socket.accept() 

accept() 函数的返回值是二元组 (conn, address),个中 conn 是处事器用来与客户端交互数据的套接字工具,address 是客户端的 IP 地点与端标语,用二元组 (host, port) 暗示。

send() 函数

send() 函数用于向长途套接字工具发送数据。留意,本机套接字必需与长途套接字乐成毗连后才气行使该函数,不然会报错。可见,send() 函数只能用于 TCP 历程间通讯,而对付 UDP 历程间通讯应该用 sendto() 函数。函数原型如下:

  1. socket.send(bytes[, flags]) 

bytes 参数代表即将发送的 bytes 工具数据。譬喻,对付字符串 "hello world!" 而言,必要用 encode() 函数转换为 bytes 工具 b"hello world!" 才气举办收集传输。

flags 可选参数用于配置 send() 函数的非凡成果,默认值为 0,也可由一个或多个预界说值构成,用位或操纵符 | 离隔。详情可参考 Unix 函数手册中的 send(2),flags 参数的常见取值有 MSG_OOB、MSG_EOR 、MSG_DONTROUTE等。

send() 函数的返回值是发送数据的字节数。

recv() 函数

recv() 函数用于从长途套接字工具吸取数据。留意,与 send() 函数差异,recv() 函数既可用于 TCP 历程间通讯,也能用于 UDP 历程间通讯。函数原型如下:

  1. socket.recv(bufsize[, flags]) 

bufsize 参数代表套接字可吸取数据的最大字节数。留意,为了使硬件装备与收集传输更好地匹配,bufsize 参数的值最好配置为 2 的幂次方,譬喻 4096。

flags 可选参数用于配置 recv() 函数的非凡成果,默认值为 0,也可由一个或多个预界说值构成,用位或操纵符 |离隔。详情可参考 Unix 函数手册中的 recv(2),flags 参数的常见取值有 MSG_OOB、MSG_PEEK、MSG_WAITALL 等。

recv() 函数的返回值是吸取到的 bytes 工具数据。譬喻,吸取到 bytes 工具 b"hello world!",最好用 decode() 函数转换为字符串 "hello world!" 再打印输出。

close() 函数

close() 函数用于封锁当地套接字工具,开释与该套接字毗连的全部资源。

  1. socket.close() 

threading 模块

本节先容上述代码顶用到的内建模块 threading,是 Python 多线程的焦点模块。

Thread() 类

Thread() 类可以建设线程工具,用于挪用 start() 函数启动新线程。类原型如下:

  1. class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) 
  • group 参数作为往后实现 ThreadGroup() 类的保存参数,今朝默认值为 None。
  • target 参数代表线程被 run() 函数激活后挪用的函数,默认值为 None,即没有任何函数会被挪用。
  • name 参数代表线程名,默认值为 None,则体系会自动为其定名,名目为「Thread-N」,N 是从 1 开始的十进制数。
  • args 参数代表 target 参数指向函数的平凡参数,用元组(tuple)暗示,默认值为空元组 ()。
  • kwargs 参数代表 target 参数指向函数的要害字参数,用字典(dict)暗示,默认值为空字典 {}。
  • daemon 参数用于标示历程是否为保卫历程。若配置为 True,则标示为保卫历程;若配置为 False,则标示为非保卫历程;若配置为 None,则担任当前父线程的 daemon 参数值。

建设完线程工具后,需行使工具的内置函数节制多线程勾当。

start() 函数

start() 函数用于开启线程勾当。函数原型如下:

  1. Thread.start() 

留意,每个线程工具只能挪用一次 start() 函数,不然会导致 RuntimeError 错误。

0x07 总结

本文先容了 TCP 协议与 socket 编程的基本常识,再用 Python 3 实现并演示了 TCP 处事器与客户端的通讯进程,个中还运用了简朴的多线程技能,最后将剧本中涉及到的 Python API 做成了的参考索引,有助于领略实现进程。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读