加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

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

发布时间:2019-08-30 06:06:59 所属栏目:外闻 来源: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 做成了的参考索引,有助于理解实现过程。

(编辑:好传媒网)

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

热点阅读