这两天在学习Python的socket编程,简易实现了一个udp聊天的功能。先上代码
import socket class Chat(object): """udp聊天类""" __PORT = 8090 # 自己的端口 def __init__(self, friend_ip, friend_port): """ 初始化方法 :param friend_ip:你要跟聊天的“人”的IP :param friend_port:你要跟聊天的“人”的端口 """ self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_socket.bind(("", Chat.__PORT)) self.friend_ip = friend_ip self.friend_port = friend_port @classmethod def set_port(cls, port): """设置自己的端口""" cls.__PORT = port def send(self): """发送消息""" msg = input("我说:\n ") # 判断是否退出聊天 if msg == "exit": self.end("我") self.udp_socket.sendto(msg.encode("utf-8"), (self.friend_ip, self.friend_port)) self.get() def get(self): """接收消息""" msg = self.udp_socket.recvfrom(1024) msg_content = msg[0].decode("gbk") if msg_content == "exit": self.end(self.friend_ip) print("%s 说:" % self.friend_ip) print(" \033[0;32;m%s\033[0m" % msg_content) self.send() def end(self, who): """结束聊天""" print("%s 结束了聊天" % who) self.udp_socket.close() exit() def run(self): """程序启动""" print("你们可以开始欢快的聊天了,输入exit退出聊天") self.send() if __name__ == "__main__": chat = Chat("192.168.21.31", 8080) chat.run()
程序说明:
1.__init__初始化方法主要完成套接字的初始化和传入和谁聊天的“人”的IP和端口号,其中:
函数 socket.socket 创建一个 socket,该函数带有两个参数:
Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
2.send方法负责发送数据,由socket的sendto方法实现,该方法第一个参数是需要发送的数据,第二参数是发送到的地址参数,这是一个元组(ip,port)。
3.get方法负责接收数据,由socket的recvfrom方法实现,该方法的参数表示接收的字节数,返回的结果是一个元组。
4.run方法启动程序
总结,Python的udp实现还是比较简单的,用此实现的聊天功能也比较容易。不过也有明显的弊端,就是这样聊天会产生阻塞的情况。
附上程序运行图(借助一个软件实现的交互功能):
这是一个网络调试辅助软件,右上表示接收到的数据,右下可以给指定ip,发送数据。