TCP协议 面向链接 可靠的 面向字节流形式的python
tcp是基于连接的,必须先启动服务端,而后再启动客户端去连接服务端服务器
TCP协议编码流程:socket
服务器端: 客户端tcp
实例化对象 实例化对象ide
绑定IP地址和端口号 编码
监听spa
接收客户端的链接 链接服务器3d
收发 收发code
关闭 关闭对象
解决方法:
#加入一条socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听连接 conn,addr = sk.accept() #接受客户端连接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
tcp三次握手: 必定是client先发起请求
a 客户端发起请求链接服务器
b 服务器返回:接收到请求,并要求链接客户端
c 客户端回复:能够链接
四次挥手: 谁先发起断开链接的请求均可以
a 客户端发起断开链接的请求:
意思是: 我想和你断开链接,我没有数据要继续发送了,可是若是你有数据须要发送,我能够继续接收
b 服务器回复 : 我接收到你的请求了
c 服务器发送 : 我已经准备好断开链接了
d 客户端回复 : 收到你的信息,断开链接
tcp实现的一个聊天室, 能够实现一对多,可是必须断掉别人的链接, 而后才能和下一我的聊,本质仍是一对一
只是建立一个死循环,让服务器一直处于待机状态
while 1: conn,addr = sk.accept()
1 import socket 2 3 4 sk = socket.socket() 5 sk.bind(('127.0.0.1',8888)) 6 sk.listen() 7 8 while 1: 9 10 conn,addr = sk.accept() 11 12 msg_r = conn.recv(1024) 13 if msg_r.decode('utf-8') != 'q': 14 print(msg_r.decode('utf-8')) 15 16 else: 17 break 18 19 msg_s = input('>>>') 20 if msg_s != 'q': 21 conn.send(msg_s.encode('utf-8')) 22 else: 23 conn.send(msg_s.encode('utf-8')) 24 break
1 import socket 2 3 name = input('请输入你的名字:\n') 4 5 sk = socket.socket() 6 sk.connect(('127.0.0.1', 8888)) 7 8 9 while 1: 10 11 msg_s = input('>>>') 12 if msg_s != 'q': 13 sk.send((name + msg_s).encode('utf-8')) 14 else: 15 sk.send(msg_s.encode('utf-8')) 16 break 17 18 msg_r = sk.recv(1024) 19 if msg_r != 'q': 20 print(msg_r.decode('utf-8')) 21 else: 22 break 23 24 sk.close()
1 import socket 2 3 name = input('请输入你的名字:\n') 4 5 sk = socket.socket() 6 sk.connect(('127.0.0.1', 8888)) 7 8 while 1: 9 10 msg_s = input('>>>') 11 if msg_s != 'q': 12 sk.send((name + msg_s).encode('utf-8')) 13 else: 14 sk.send(msg_s.encode('utf-8')) 15 break 16 17 msg_r = sk.recv(1024) 18 if msg_r != 'q': 19 print(msg_r.decode('utf-8')) 20 else: 21 break 22 23 sk.close()