参考代码:
# 半双工方式:
# 接收端:先接收数据。
# 发送端:向接收端发送数据
# 接收端:受到发送端发送的数据后,执行发送数据功能
# 发送端:向接收端发送数据后,执行接收数据功能(阻塞状态:等待数据到来)
import socket
def send():
# 1.创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定元组
local_addr = ("", 7898)
udp_socket.bind(local_addr)
# 获取对方的ip和端口
dest_ip = input("请输入对方的ip:")
try:
dest_port = int(input("请输入对方的端口:"))
except:
print("error input!")
# 3.循环发数据
while True:
msg = input("(enter 'exit' to quit!)>")
# 发的数据要编码
# udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
if msg == 'exit':
print('bye!')
break
# 接收回送的数据
# recvfrom在数据未到来前,会堵塞
recv_data = udp_socket.recvfrom(1024)
recv_msg = recv_data[0].decode('utf-8')
print("recive msg:%s"% recv_msg)
if recv_msg == 'exit':
break
# 4.关闭套接字
udp_socket.close()
def recive():
# 1.创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定元组
local_addr = ("", 7788)
udp_socket.bind(local_addr)
# 获取对方的ip和端口
dest_ip = input("请输入对方的ip:")
try:
dest_port = int(input("请输入对方的端口:"))
except:
print("error input!")
# 3.循环发数据
while True:
# 接收回送的数据
# recvfrom在数据未到来前,会堵塞
recv_data = udp_socket.recvfrom(1024)
# print(recv_data)
recv_msg = recv_data[0].decode('utf-8')
print("recive msg:%s"% recv_msg)
if recv_msg == 'exit':
break
msg = input("(enter 'exit' to quit!)>")
# 发的数据要编码
# udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
if msg == 'exit':
print('bye!')
break
# 4.关闭套接字
udp_socket.close()
if __name__ == "__main__":
func = ('exit', send, recive)
choosenum = int(input("please enter which func to do(1:send, 2:recive):"))
if choosenum<3 and choosenum>0:
func[choosenum]()
注意:当程序没有开始receive时,已经来了数据,而且操作系统收到了数据(指防火墙等安全防护软件通过了这个端口的数据 ),则操作系统会先将数据存起来,等程序打开receive时会取走。