Efecto de ejecución del cliente
Al escribir n
, ejecutar como cliente
Efecto de operación del servidor
Entrada y
, ejecutar como servidor
Código
import socket
class UdpChat(object):
"""UDP聊天器, 单工模拟"""
def __init__(self, is_server=True, ip="127.0.0.1", port=8088):
# 是否为服务端
self.is_server = is_server
# 要发送消息的目标地址
self.destination_address = (ip, port)
# 创建udp套接字
self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址信息
bind_address = (ip, port)
# 当作为服务端运行时, 绑定
if self.is_server:
# 绑定ip和端口
self.udp_socket.bind(bind_address)
def send_message(self):
"""发送信息"""
# 要发送的字符串信息
send_str = input("请输入要发送的信息:")
# utf-8编码
send_byte = send_str.encode("utf-8")
# 发送udp信息
self.udp_socket.sendto(send_byte, self.destination_address)
def receive_message(self):
"""接收消息"""
# 接收udp信息, 接收1024字节
receive_data = self.udp_socket.recvfrom(1024)
# 发送方的ip地址
ip_address = receive_data[1][0]
# 发送方的端口
port = receive_data[1][1]
# 信息经过utf-8解码
receive_str = receive_data[0].decode("utf-8")
# 返回发送方的地址信息和接收到的信息
return ip_address, port, receive_str
def run(self):
"""整体控制运行"""
# 当作为服务端运行时
if self.is_server:
print("正在等待接收数据......")
# 接收消息
ip_address, port, receive_str = self.receive_message()
# 打印发送方的地址信息和接收到的信息
print("接收到来自[{}:{}]发送的信息: 【{}】".format(ip_address, port, receive_str))
# 客户端运行时
else:
# 发送信息
self.send_message()
def main():
"""主函数"""
# 接收输入, 并去除左右空格
is_server = input("是否作为服务端运行? [y/n]:").strip()
while True:
# 当输入y时
if is_server.upper() == "Y":
# 作为服务端运行
UdpChat().run()
elif is_server.upper() == "N":
# 作为客户端运行
UdpChat(is_server=False).run()
else:
print("输入信息有误")
exit()
if __name__ == '__main__':
main()