套接字
套接字
客户端/服务器架构
Server端:
1、要一直提供服务。
2、要绑定一个唯一的地址,让客户端能都明确的找到。
基于网络通讯的套接字分为TCP协议工作的和UDP协议工作的。
TCP协议工作:
服务端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 AF_INET基于网络通讯的套接字,SOCK_STREAM基于TCP协议的套接字 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加,SO_REUSEADDR是重置 phone.bind(('127.0.0.1',8080)) #绑定手机卡,服务端ip phone.listen(5) #开机 ?5 print('starting....') while True: #链接循环 conn,addr=phone.accept() #等待电话链接 print('电话线路是',conn) print('客户端的手机号是',addr) while True: #通信循环 try: #应对windows系统 data=conn.recv(1024) #收消息 ?1024 if not data:break #linux系统 print('客户端发来的消息是',data) conn.send(data.upper()) #发给客户端的消息 except Exception: break conn.close() phone.close()
客户端
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8080)) while True: #通信循环 msg=input('>>: ').strip() if not msg:continue phone.send(msg.encode('utf-8')) #发送的 print('has send===========>',msg) data=phone.recv(1024) #收到的 print('has recv===========>',data) print(data) phone.close()
UDP协议工作的套接字:
UDP用户数据报协议,是无连接的,面向消息的,提供高效率服务,不会使用块的合并优化算法,由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了,即面向消息的通信是有消息保护边界的。
Server端:
import socket udpserver=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) udpserver.bind(('127.0.0.1',8080)) while True: #通讯循环 data,client_addr=udpserver.recvfrom(1024) print('======>',data.decode('utf-8')) print(client_addr) msg=input('>>: ') # udpserver.sendto(data.upper(),client_addr) udpserver.sendto(msg.encode('utf-8'),client_addr)
Client端:
import socket udpclient=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server_ip_port=('127.0.0.1',8080) while True: inp=input(">>: ") udpclient.sendto(inp.encode('utf-8'),server_ip_port) data,server_addr=udpclient.recvfrom(1024) print(data.decode('utf-8'))
---------- END ----------