manongpengzai 2018-11-04
之前我们一起实现过单线程的udp聊天功能,但是并不实用,这里我们用多线程重新写下
代码如下:
import socket
import threading
def print_menu():
"""显示菜单"""
print("请输入你要进行的操作: 1 发送数据 2接收数据 3退出")
def recv_data(udp_socket):
"""接收数据"""
# 数据 发送人地址
data, remote_address = udp_socket.recvfrom(4096)
print("收到来自%s的数据-----%s" % (remote_address, data.decode()))
def send_data(udp_socket):
"""发送数据"""
"""
请输入你要发送的数据:你吃了大蒜吗?
IP地址:192.168.113.113
端口:8080
"""
# 接收用户输入的数据 IP port
data = input("请输入你要发送的数据:")
ip = input("IP地址:")
port = int(input("端口:"))
udp_socket.sendto(data.encode(), (ip, port))
def main():
# 显示一个界面(菜单) 请输入你要进行的操作: 1 发送数据 2退出
# 创建一个子线程 专门收数据
# 主线程 用以接收用户键盘输入 发送
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 创建线程 收数据
recv_thd = threading.Thread(target=recv_data, args=(udp_socket,))
recv_thd.start()
# 在使用之前进行绑定
udp_socket.bind(('', 8888))
while True:
print_menu()
# 接收用户输入
op = input("请选择:")
if op == '1':
send_data(udp_socket)
elif op == '2':
break
else:
print("出错了")
# 关闭
udp_socket.close()
if __name__ == '__main__':
main()