基于python的网络聊天程序(UDP)

基于python的网络聊天程序(UDP)

聊天程序总代码:

import argparse,socket
import  threading
MAX_BYTES = 65535
def udpChatre(selfip,selfPort):
    sock = socket.socket( socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind(( selfip, selfPort))
    print('UDP聊天程序启动监听地址为:{}'.format(sock.getsockname()))
    while True:
            data,address = sock.recvfrom(MAX_BYTES)
            text = data.decode( 'utf-8')
            print("{}发来信息:".format(address))
            print( text)
def udpChatse(otherip,otherPort):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        text = input('请输入你想发送的文本:')
        data = text.encode('utf-8')
        sock.sendto(data, (otherip, otherPort))
class myThread1(threading.Thread):
    def __init__(self, selfip, selfPort):
        threading.Thread.__init__(self)
        self.selfip= selfip
        self.selfPort = selfPort
    def run(self):
        udpChatre(self.selfip, self.selfPort)
class myThread2(threading.Thread):
    def __init__(self, otherip, otherPort):
        threading.Thread.__init__(self)
        self.otherip= otherip
        self.otherPort = otherPort
    def run(self):
        udpChatse(self.otherip, self.otherPort)
if __name__=='__main__':
    parser = argparse.ArgumentParser(description= 'UDP Chat')
    parser.add_argument('sip',help='what is selfip')
    parser.add_argument('oip', help='what is otherip')
    parser.add_argument( '-s', metavar='PORT',type=int,default=1060,help= 'UDP port (default 1060) ')
    parser.add_argument( '-o' , metavar='PORT', type=int,default=1061,help='UDP port (default 1060) ')
    args = parser.parse_args()
  #  udpChat( args.sip,args.oip,args.s,args.o)
    thread1=myThread1(args.sip,args.s)
    thread2=myThread2(args.oip,args.o)
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

运行截图:

请添加图片描述

请添加图片描述

实验说明:

  • 在运行此程序必须在同一个网段下,比如同一个局域网或者虚拟机桥接模式下
  • 要知道聊天程序即是客服端也是服务器。所以聊天程序首先进行套接字定义和绑定端口号,然后用一个循环实现数据的接收和发送,在主函数定义的时候,需要定义两个端口号,一个是自己端口号,另一个是对方的端口号。
  • 分析多线程代码,我们可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即它调用了线程的 run() 方法,这就继承两个类的原因。后面主函数是首先创建线程,然后开启线程。

就这样走了吗??请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

猜你喜欢

转载自blog.csdn.net/qq_56607768/article/details/120314606
今日推荐