socket (简称:套接字),它是一个进程之间的一个工具,进程之间想要进行网络通讯就需要socket
socket的作用是负责进程之间的网络数据传输

tcp网络应用程序分为:客户端和服务端(俗称:服务器)
一、客户端与服务器数据交换流程图:(图借用于https://blog.csdn.net/qq_37200329/article/details/100065914)

解析(客户端):socket():是socket库的方法 connect():建立链接 recv():是接收数据 send():发送数据
解析(服务端):socket():是socket库的方法 bind():绑定端口号 listen():设置监听 、 accept():等待链接,没有接收到链接的时候会一直等待 recv():是接收数据 send():发送数据
客户端:流程 创建客户端套接字对象、建立链接、发送数据、接收数据、关闭客户端套接字

服务端流程: 创建服务端套接字对象、绑定端口、设置监听、等待客户端请求、发送数据、接收数据、关闭服务端套接字


问题:在与服务端连接中突然出现问题,例如服务端突然中断(不论是出现问题导致的中断),那么服务端的端口不会被立即被释放,而是需要等待1-2分钟
解决方法:1、更换服务器端端口号 (即:修改端口代码) 2、设置端口号的复用(即端口立即释放)
如何设置端口号复用呢:
方法:在设置bind()之前,设置
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
socket.SOL_SOCKET:表示当前套接字
socket.SO_REUSEADDR:表示复用端口的选项
True:确认复用
关于TCP socket文字注意点:
1、客户端与服务器端想要进行通信的时候,必须建立链接
2、客户端可以不绑定端口号,但客户端必须建绑定端口,不然客户端是找不到服务端程序
3、listen后的套接字,只负责等待连接请求,·收发信息是(服务端)新的套接字来处理(accept()方法返回)
4、关闭listen后的套接字,不再建立链接 (新的客户端),正在通信的客户端还是正常的
5、关闭accept()的套接字,则意味着客户端已经通信完毕
6、当客户端套接字调用了close方法后,服务端的recv会解除阻塞,返回字段为0.服务端可以通过数据长度来判断客户端是否已经下线。反之服务器的返回数据为0,客户端的recv也会解除阻塞,返回的数据的长度也为0