一、TCP协议的原理图
每个客户端与服务端通讯是互不干扰的
二、注意点
1、tcp服务器─般情况下都需要绑定,否则客户端找不到这个服务器
2、tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好
3、tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
4、当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
5、listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
6、关闭]listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
7、关闭accept返回的套接字意味着这个客户端已经服务完毕
8、当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线
对第8点进行解释:
服务器端
from socket import *
# todo 1、创建server-socket TCP协议
server_socket = socket(AF_INET, SOCK_STREAM)
# todo 2、创建目标服务器,绑定一个IP和端口 服务器里面空的字符串代表server_socket绑定这台机器下的任何ip地址
host_port = ('', 8088)
server_socket.bind(host_port)
# todo 3、监听服务器的socket,listen让socket处于被动。这时就可以接收客户端的连接请求了
server_socket.listen(5) # 一般为5,表示客户端线程挂起的个数
# todo 4、等待客户端的连接请求,当前函数是线程阻塞的函数,accept返回2个值,第一个:新的socket,第二个:客户端地址
new_socket, client_addr = server_socket.accept() # todo 新创建的socket是server_socket中的子socket,只是和当前的客户端(一个客户端)收发数据
# todo 5、服务器接收客户端发送过来的数据,recv一般用于TCP协议的接收数据,recvfrom用于UDP
data = new_socket.recv(1024) # data是字节数据
print('服务器接收的数据是:', data.decode('utf-8'))
# todo 6、服务器端发送数据给客户端,在TCP中发送数据用send,UDP用sendto
new_socket.send('THANK you'.encode('utf-8'))
# 关闭套接字
new_socket.close() # todo new_socket关闭意味着当前客户端的服务已经完成
server_socket.close() # todo server_socket关闭意味着整个服务器全部关闭
客户端
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123595.html