udp:
一:udp 发送数据:
如果只是发送数据的话,没必要绑定端口(其实操作系统会给随机分配个端口),只需要知道对方的ip 和port 就可以了,用sendto发送即可!
1 from socket import * 2 3 def main(): 4 udp_socket = socket(AF_INET,SOCK_DGRAM) 5 6 while True: 7 send_data = input("请输入要发送的内容>>>") 8 if send_data == 'exit': 9 break 10 11 addr =("192.168.137.1",8080) 12 udp_socket.sendto(send_data.encode("utf8"),addr) 13 14 udp_socket.close() 15 16 if __name__ == '__main__': 17 main()
二:udp 接收数据 :
但是如果要接收数据,程序就必须得有个固定的端口,这样别人发送的时候才能发送!
1 from socket import * 2 3 def main(): 4 #创建套接字 5 udp_socket = socket(AF_INET,SOCK_DGRAM) 6 7 #绑定本机一个固定端口,用于接收数据 8 local_addr = ("",9090) #空的字符串代表本机任何一个ip 9 udp_socket.bind(local_addr) 10 11 #接收数据 recv_data 收到的既有内容还有 对方的ip +port 12 recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节 ,如果收不到会在这阻塞。 13 print(recv_data) #(b'hello world', ('192.168.137.1', 8080)) 14 #意思是收到了192.168.137.1 中8080 端口发来的数据 15 16 17 #关闭套接字 18 udp_socket.close() 19 20 if __name__ == '__main__': 21 main()
三:udp 发送和接收:
服务端:
1 from socket import * 2 3 def main(): 4 #创建套接字 5 udp_socket = socket(AF_INET,SOCK_DGRAM) 6 7 #绑定本机一个固定端口,用于接收数据 8 local_addr = ("",9090) #空的字符串代表本机任何一个ip 9 udp_socket.bind(local_addr) 10 11 while True: 12 #接收数据 recv_data 收到的既有内容还有 对方的ip +port 13 recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节 14 print("收到数据:",recv_data[0].decode("gbk")) #之所以用gbk是因为对面用的是 ,windows默认用gbk 编码 15 print("对方的ip,port: ",recv_data[1]) 16 c_ip_port = recv_data[1] #是个元组 17 18 send_data = "滚一边去,老子没空" 19 udp_socket.sendto(send_data.encode("gbk"),c_ip_port) 20 21 #关闭套接字 22 udp_socket.close() 23 24 if __name__ == '__main__': 25 main()
注:可以用tcp/udp 调试工具来模拟客户端!
udp小案例:udp 聊天器:
通过网络不仅可以不同电脑通信,同一台电脑也可以通信:
每个电脑都有一个127.0.0.1 ,它是不变的,可以用于本机两个进程间的通信!
1,阻塞等待!
单工:收音机(客户端只能接受数据)
半双工:对讲机(在收的时候发不了,发的时候收不了)
全双工:打电话(在收的时候也能发)
2,socket 是全双工!
TCP (重点):
一:tcp服务端:
1 from socket import * 2 3 def main(): 4 #创建套接字 5 tcp_socket = socket(AF_INET,SOCK_STREAM) 6 #绑定固定端口 7 tcp_socket.bind(("",9090)) 8 9 #设置最大监听数 10 tcp_socket.listen(128) #最大监听数设置为128 11 #accept()获得客户端的ip 和端口 12 while True: 13 new_socket,c_addr = tcp_socket.accept() 14 print(c_addr) 15 #通信 16 while True: 17 recv_data = new_socket.recv(1024) 18 print(recv_data.decode("gbk")) 19 20 if recv_data: 21 send_data = input("请输入(to client)>>>") 22 new_socket.send(send_data.encode("gbk")) 23 else: 24 break #使用它来退出循环 25 26 new_socket.close() #关闭用于通信的套接字 27 28 #关闭套接字 29 tcp_socket.close() 30 31 32 if __name__ == '__main__': 33 main()
但是,在win 平台上面,老是会抛出异常,所以,我们要用异常去捕捉它,并利用异常退出循环
1 from socket import * 2 3 def main(): 4 #创建套接字 5 tcp_socket = socket(AF_INET,SOCK_STREAM) 6 #绑定固定端口 7 tcp_socket.bind(("",9090)) 8 9 #设置最大监听数 10 tcp_socket.listen(128) #最大监听数设置为128 11 #accept()获得客户端的ip 和端口 12 while True: 13 new_socket,c_addr = tcp_socket.accept() 14 print(c_addr) 15 #通信 16 while True: 17 try: 18 recv_data = new_socket.recv(1024) 19 print(recv_data.decode("gbk")) 20 21 send_data = input("请输入(to client)>>>") 22 new_socket.send(send_data.encode("gbk")) 23 except: 24 break 25 new_socket.close() #关闭用于通信的套接字 26 27 #关闭套接字 28 tcp_socket.close() 29 30 31 if __name__ == '__main__': 32 main()
二:tcp客户端:
1 from socket import * 2 3 def main(): 4 #建立soket套接字 5 tcp_socket = socket(AF_INET,SOCK_STREAM) 6 7 #connect() 连接服务器 8 s_ip = "192.168.137.1" 9 s_port = 9090 10 tcp_socket.connect((s_ip,s_port)) 11 12 #通信 13 while True: 14 send_data = input("请输入要输入的内容(to server)>>>") 15 tcp_socket.send(send_data.encode("gbk")) 16 17 recv_data= tcp_socket.recv(1024) #每次收1024字节 18 print(recv_data.decode("gbk")) 19 20 #断开连接 21 tcp_socket.close() 22 23 if __name__ == '__main__': 24 main()