发送数据的流程
- 创建套接字
- 发送数据
- 关闭套接字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import socket
def main(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) local_addr = ("", 7890) udp_socket.bind(local_addr) desc_addr = ("10.197.36.81", 8080) while True: sent_content = input("请输入要发送的消息:") if(sent_content == "exit"): break udp_socket.sendto(sent_content.encode("gbk"), desc_addr)
udp_socket.close()
if __name__ == "__main__": main()
|
接收数据的流程
- 创建套接字
- 绑定本地自己的信息(ip及port)
- 接收数据
- 关闭套接字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import socket import datetime
def main(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) local_addr = ("", 8088) udp_socket.bind(local_addr) times = datetime.datetime.now().strftime('%F %T') while True: recv = udp_socket.recvfrom(1024) recv_data = recv[0].decode("gbk") recv_addr = recv[1][0]; print("【%s】 接收到来自%s的消息:\n%s" % (times, recv_addr, recv_data)) udp_socket.close()
if __name__ == "__main__": main()
|
同一个端口不允许同一时刻被使用两次
Question
- recvfrom 在没有数据到来时,会怎样?
会阻塞。
套接字是可以同时收发数据的。
socket套接字是全双工。
单工:单工数据传输只支持数据在一个方向上传输。
半双工: 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
全双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
案例:UDP聊天器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import socket
def send_msg(udp_socket): desc_ip = input("请输入对方的IP地址:") desc_port = int(input("请输入对方的端口号:")) desc_addr = (desc_ip, desc_port) send_content = input("请输入需要发送的消息:") udp_socket.sendto(send_content.encode("gbk"), desc_addr)
def recv_msg(udp_socket): recv_data = udp_socket.recvfrom(1024) recv_msg = recv_data[0].decode("gbk") recv_addr = recv_data[1][0] print("您收到了来自【%s】的消息:\n%s" % (recv_addr, recv_msg))
def main(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
local_addr = ("", 8888) udp_socket.bind(local_addr) while True: print("------------- UDP聊天器 -------------") print("1. 发送数据") print("2. 接收数据") print("0. 退出系统") choice = input("请输入功能选项:") if choice == "1": send_msg(udp_socket) elif choice == "2": recv_msg(udp_socket) elif choice == "0": break else: print("输入有误,请重新输入!\n")
if __name__ == "__main__": main()
|