udp 不需要经过3次握手和4次挥手,不需要提前建立连接,直接发数据就行。
server端
- import socket
- BUFSIZE = 1024
- ip_port = ('127.0.0.1', 9999)
- server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp协议
- server.bind(ip_port)
- while True:
- data,client_addr = server.recvfrom(BUFSIZE)
- print('server收到的数据', data)
-
- server.sendto(data.upper(),client_addr)
-
- server.close()
-
client端
- import socket
- BUFSIZE = 1024
- client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- while True:
- msg = input(">> ").strip()
- ip_port = ('127.0.0.1', 9999)
- client.sendto(msg.encode('utf-8'),ip_port)
-
- data,server_addr = client.recvfrom(BUFSIZE)
- print('客户端recvfrom ',data,server_addr)
-
- client.close()
-
输出结果
- server:
-
- server收到的数据 b'hello'
- server收到的数据 b'world'
-
-
- client:
- >> hello
- 客户端recvfrom b'HELLO' ('127.0.0.1', 9999)
- >> world
- 客户端recvfrom b'WORLD' ('127.0.0.1', 9999)
- >>
-
server
- from socket import *
- import time
- server=socket(AF_INET,SOCK_DGRAM)
- server.bind(('127.0.0.1',8880))
-
-
- res1=server.recvfrom(10) #b'hello'
- print('第一次:',res1)
-
- res2=server.recvfrom(1024) #b'world'
- print('第二次:',res2)
-
-
- server.close()
-
client
- from socket import *
- import time
- client = socket(AF_INET, SOCK_DGRAM)
-
-
- client.sendto(b'hello',('127.0.0.1',8880))
-
- client.sendto(b'world',('127.0.0.1',8880))
-
- client.close()
-
服务端结果:没有产生粘包
- 第一次: (b'hello', ('127.0.0.1', 63959))
- 第二次: (b'world', ('127.0.0.1', 63959))
- server:
-
-
- from socket import *
- import time
- server=socket(AF_INET,SOCK_DGRAM)
- server.bind(('127.0.0.1',8880))
-
-
- res1=server.recvfrom(2) #b'he'
- print('第一次:',res1)
- time.sleep(6)
- res2=server.recvfrom(1024) #b'world'
- print('第二次:',res2)
-
-
- server.close()
-
-
- client:
-
- from socket import *
- import time
- client = socket(AF_INET, SOCK_DGRAM)
-
-
- client.sendto(b'hello',('127.0.0.1',8880))
- time.sleep(5)
- client.sendto(b'world',('127.0.0.1',8880))
-
- client.close()
输出结果
- windows直接报错:
- Traceback (most recent call last):
- /路飞/第三模块/第二章网络编程/06 基于udp协议的套接字/服务端.py", line 24, in <module>
- res1=server.recvfrom(2) #b'he'
- OSError: [WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。
-
-
- mac或linux:
- 直接丢包,只收到b'he',后面的llo不会收到
-
tcp基于链接通信
udp无链接