版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/82154174
在学习UDP的时候,想着试一试能不能搞一个命令窗口的udp聊天工具,因为udp的广播机制,所以就想着干脆直接搞一个群聊的吧。不过最后搞来搞去,命令窗口下使用多线程,没有做出什么好看整洁的“图形化”界面,凑合着用吧,毕竟是一个练习的学习型的小玩意。有时间把打印格式再搞一搞,争取以后能好看一点。
不说了,上代码(先来一个V1.0):
#!/usr/bin/python3
# -*-coding:utf-8-*-
"""使用udp实现群聊9091聊天室"""
# 导包
import socket, threading
port = 9090
ip_host = "192.168.14.255"
# 发送消息
def send_msg(udp_socket,address):
send_content = input(">")
# 发送
udp_socket.sendto(send_content.encode('gbk'),address)
# 接受消息
def recv_msg(udp_socket):
while True:
recv_data, ip_port = udp_socket.recvfrom(1024)
print("来自:" + str(ip_port))
print(recv_data.decode('gbk'))
if __name__ == '__main__':
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 绑定端口
udp_socket.bind(('', port))
# 设置目标地址
# addr = ("192.168.14.255", 9090)
# 创建接受数据的线程
recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
# 设置成为守护进程
recv_thread.setDaemon(True)
recv_thread.start()
while True:
# 接受用户指令
option = input("请输入功能:1.发送\t2.退出\n")
if option == '1':
addr = (ip_host, port)
send_msg(udp_socket, addr)
elif option == '2':
break
# 关闭流
udp_socket.close()
再来一个版本(v1.2):
#!/usr/bin/python3
# -*-coding:utf-8-*-
"""使用udp实现群聊9091群聊天室"""
# 导包
import socket, threading
port = 9091
ip_host = "192.168.14.255" # 广播地址
# 创建套接字
def create_socket():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
udp_socket.bind(('', port))
print(udp_socket)
# 设置广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
return udp_socket
# 发送消息
def send_msg(udp_socket):
while True:
send_content = input(">")
# 发送
udp_socket.sendto((send_content+"\r\n").encode('gbk'),(ip_host,port))
# 接受消息
def recv_msg(udp_socket):
while True:
recv_data, ip_port = udp_socket.recvfrom(1024)
print(("来自:" + str(ip_port)).rjust(50))
print(recv_data.decode('gbk').rjust(50))
print("-"*80)
if __name__ == '__main__':
udp_socket = create_socket()
# 创建接受数据的线程
recv_thread = threading.Thread(target=recv_msg, args=(udp_socket,))
# 设置成为守护进程
recv_thread.setDaemon(True)
recv_thread.start()
send_thread = threading.Thread(target=send_msg, args=(udp_socket,))
send_thread.start()
# # 关闭流
# udp_socket.close()