开发者学堂课程【Python 入门 2020年版:Tcp 服务器 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10463
Tcp 服务器
内容介绍
一. 概念
二. 服务端代码及注释
三. 补充解释
四. TCP 注意事项
一.概念
TCP 服务端
在程序中,如果想要完成一个 tcp 服务器的功能,需要的流程如下:
1.socket 创建一个套接字
2.bind 绑定 ip 和 port
3.listen 使套接字变为可以被动链接
4.accept 等待客户端的链接
5.recv/send 接收发送数据
二.服务端代码及注释
1.代码
import socket
#创建一个 socket 连接
s=socket.socket(socket.AFINET,socket.SOCK_STREAM) s.bind(('192.168.31.199',9090))
s.listen(128)
# 把 socket 变成一个被动监听的 socket
#<socket.socket fd=512,famiLy=AddressFamiLy.AF-INET, type=SocketKind.SOCK
_STREAM,proto=0,laddr=(‘192.168.31.199’ ,9090),raddr=('192.168.31.185’,38096)>('192.168.31.185', 38096))
#('192.168.31.185', 38096)
#接收到的结果是一个元组,元组里有两个元素
#第 0 个元素是客户端的 socket 连接,第 1 个元素是客户端的 ip 地址和端口号
#x=s.accept()
#接收客户端的请求
client_socket,client_addr=s.accept()
#udp 里接收数据,使用的 recvfrom
data=client socket.recv(1024)
# tcp 里使用 recv 获取数据
print('接收到了{}客户端{}端口号发送的数据,内容是:
{}'.format(client_addr[0],client_addr[1],data.decode(‘utf8’))
2.说明
三.补充解释
1.队列排队
s.listen(128) 这里的 128 相当于排队,达到服务器最大处理能力时,其他用户要在队列里面排队
当服务器的极限处理是 1000 时 有 1120 个时 120 个在排队
当服务器的极限处理是 1000 时 有 1130 个时 128 个在排队 多余的 2 个不能排队,显示连接失败
2. data=client socket.recv(1024)客户端发数据给服务器的网卡 recv(1024) 是每次读取网卡中 1024 个字节
3. 首先创建一个 socket 连接,然后写入监听功能,用 x=s.accept() 接收客户端的请求。
这时我们的 TCP 服务端是 windows,会不断等待连接,当有客户端连接时x=s.accept() 会接收到客户端的要求,接收到的结果是一个元组第 0 个元素是客户端的 socket 连接,第 1 个元素是客户端的ip地址和端口号可以把元组拆成两个变量 client_socket 表示客户端连接。
然后用 data=client socket.recv(1024)获取服务器网卡里的数据
四. TCP注意事项
1.tcp 服务器一般情况下都需要绑定,否则客户端找不到这个服务器。
2. tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的 ip、 port 等信息就好,本地客户端可以随机。
3. tcp 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 tcp 服务器时必须要做的。
4. 当客户端需要链接服务器时,就需要使用 connect 进行链接,udp 是不需要链接的而是直接发送,但是 tcp 必须先链接,只有链接成功才能通信。
5. 当一个 tcp 客户端连接服务器时,服务器端会有 1 个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务。
6. listen 后的套接字是被动套接字,用来接收新的客户端的链接请求的,而 accept 返回的新套接字是标记这个新客户端的。
7.关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
8.关闭 accept 返回的套接字意味着这个客户端已经服务完毕
9.当客户端的套接字调用 close 后,服务器端会 recv 解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线。