利用Python的socket编程简易实现UDP聊天器

2018-02-02 21:02:25 Python 阅读 (5685) 评论(7)

    这两天在学习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实现还是比较简单的,用此实现的聊天功能也比较容易。不过也有明显的弊端,就是这样聊天会产生阻塞的情况。

附上程序运行图(借助一个软件实现的交互功能):

blob.png

这是一个网络调试辅助软件,右上表示接收到的数据,右下可以给指定ip,发送数据。


blob.png


评论

小焦筒靴 18-02-04 23:21:48 有个bug,我可以不停的点喜欢,记得改改~~(´∇ノ‘*)ノ

用户头像
诗意林 2018-02-05 00:19:31 有本事来打我啊
用户头像
诗意林 2018-02-04 23:54:26 按常理说,确实是点一次是喜欢,第二次是取消,但是为了增加这个喜欢次数,就是故意不做取消的,(#^.^#)
小焦筒靴 18-02-04 23:18:45 666,待我去学一下Python
zdl 18-02-02 22:16:59 厉害了
122988005 18-02-02 21:53:15 我还没学会这个,我拿去抄一遍
122988005 18-02-02 21:53:02 666