服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
半连接池就是半连接存放位置
可以设置最大半连接数来防止洪水攻击
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
1 #服务端 2 import socket 3 4 ip_port=('127.0.0.1',9000) #电话卡 5 BUFSIZE=1024 #收发消息的尺寸 6 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 7 s.bind(ip_port) #手机插卡 8 s.listen(5) #手机待机 9 10 conn,addr=s.accept() #手机接电话 11 # print(conn) 12 # print(addr) 13 print('接到来自%s的电话' %addr[0]) 14 15 msg=conn.recv(BUFSIZE) #听消息,听话 16 print(msg,type(msg)) 17 18 conn.send(msg.upper()) #发消息,说话 19 20 conn.close() #挂电话 21 22 s.close() #手机关机 23 24 #客户端 25 import socket 26 ip_port=('127.0.0.1',9000) 27 BUFSIZE=1024 28 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 29 30 s.connect_ex(ip_port) #拨电话 31 32 s.send('linhaifeng nb'.encode('utf-8')) #发消息,说话(只能发送字节类型) 33 34 feedback=s.recv(BUFSIZE) #收消息,听话 35 print(feedback.decode('utf-8')) 36 37 s.close() #挂电话
1 #服务端 2 import socket 3 ip_port=('127.0.0.1',8081)#电话卡 4 BUFSIZE=1024 5 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 6 s.bind(ip_port) #手机插卡 7 s.listen(5) #手机待机 8 9 while True: #新增接收链接循环,可以不停的接电话 10 conn,addr=s.accept() #手机接电话 11 # print(conn) 12 # print(addr) 13 print('接到来自%s的电话' %addr[0]) 14 while True: #新增通信循环,可以不断的通信,收发消息 15 msg=conn.recv(BUFSIZE) #听消息,听话 16 17 # if len(msg) == 0:break #如果不加,那么正在链接的客户端突然断开,recv便不再阻塞,死循环发生 18 19 print(msg,type(msg)) 20 21 conn.send(msg.upper()) #发消息,说话 22 23 conn.close() #挂电话 24 25 s.close() #手机关机 26 27 #客户端 28 import socket 29 ip_port=('127.0.0.1',8081) 30 BUFSIZE=1024 31 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 32 33 s.connect_ex(ip_port) #拨电话 34 35 while True: #新增通信循环,客户端可以不断发收消息 36 msg=input('>>: ').strip() 37 if len(msg) == 0:continue 38 s.send(msg.encode('utf-8')) #发消息,说话(只能发送字节类型) 39 40 feedback=s.recv(BUFSIZE) #收消息,听话 41 print(feedback.decode('utf-8')) 42 43 s.close() #挂电话
1 #服务端 2 import socket 3 ip_port=('127.0.0.1',9000) 4 BUFSIZE=1024 5 udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 6 7 udp_server_client.bind(ip_port) 8 9 while True: 10 msg,addr=udp_server_client.recvfrom(BUFSIZE) 11 print(msg,addr) 12 13 udp_server_client.sendto(msg.upper(),addr) 14 15 #客户端 16 17 import socket 18 ip_port=('127.0.0.1',9000) 19 BUFSIZE=1024 20 udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 21 22 while True: 23 msg=input('>>: ').strip() 24 if not msg:continue 25 26 udp_server_client.sendto(msg.encode('utf-8'),ip_port) 27 28 back_msg,addr=udp_server_client.recvfrom(BUFSIZE) 29 print(back_msg.decode('utf-8'),addr)
三次握手与四次挥手
TCPsocket链接原理图