python 实现udp通信

python新手,单线程程序,主要还是想分享一下成长的经历,仅供参考,写的不好的地方希望能提提建议。

"""
udp 程序
"""
import socket
import threading
import time

class Exchange(object):
    """
    定义一个类,将收发数据的函数全部封装到此类中,但是并没有用继承子类的方法来写程序
    """
    def __init__(self, ip, port):
        """
        初始化,将外部传过来的参数转化为类属性,有ip地址和端口
        :param ip:
        :param port:
        """
        self.ip = ip
        self.port = port
        self.socket_init = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.socket_init.bind(("", 7788))

    def send_msg(self):
        """
        发送消息的函数,直接按回车就可更换ip,port,发送close即可结束程序
        :return:
        """
        while True:
            send_content = input('请输入要发送的信息:')
            if send_content == '':
                try:
                    self.ip = input('请输入新的ip:')
                    self.port = int(input('请输入新的端口:'))
                except ValueError:
                    print('端口值出现问题或ip出现问题')
                    break
            if send_content == 'close':  # 关闭程序的时候也有问题(已解决)
                print('发送程序已关闭!')
                self.close()
                break
            try:
                self.socket_init.sendto(send_content.encode('utf-8'), (self.ip, self.port))
            except ValueError:
                print('编码错误')
                break

    def recv_msg(self):
        """
        接收程序,当发送程序结束后此进程也会结束
        :return:
        """
        time.sleep(0.1) # 画龙点睛纸笔
        while True:
        # 接收有问题(已解决)
            try:
                recv_data = self.socket_init.recvfrom(1024)
            except OSError:
                print('接收程序已关闭!')
                break
            try:
                print('\n收到消息:',recv_data[0].decode('utf-8'))
            except ValueError:
                print('解码错误')
                break

    def close(self):
        """
        关闭套接字
        :return:
        """
        self.socket_init.close()

if __name__ == '__main__':
    ips = input('请输入ip地址:')
    ports = int(input('请输入端口号:'))
    target_person_1 = Exchange(ips, ports)
    thread_1 = threading.Thread(target=target_person_1.send_msg)
    thread_2 = threading.Thread(target=target_person_1.recv_msg)
    thread_1.start()
    thread_2.start()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值