zoukankan      html  css  js  c++  java
  • 5 多线程 模拟qq聊天

    1.多线程思路

    • 使用多线程完成一个全双工的QQ聊天程序

        

        

     2.版本1:程序小框架

    #1.收数据,然后打印
    def recvData():
        pass
    
    #2.检测键盘,发数据
    def sendData():
        pass
    
    
    def main():
        pass
    
    if __name__ == "__main__":
        main()

        

    3.版本:2:该程序框架,多线程

         

    from threading import Thread
    
    #1.收数据,然后打印
    def recvData():
        while True:
            recvInfo = udpSocket.recvfrom(1024)
            print(">>%s:%s"%(recvInfo[1],recvInfo[0]))
    
    #2.检测键盘,发数据
    def sendData():
        while True:
            sendInfo = input("<< ")
            udpSocket.sendto(sendInfo.encode("gb2312"),(xxx_ip,xxx_port))
    
    
    def main():
        tr = Thread(target=recvData)
        ts = Thread(target=sendData)
    
        tr.start()
        ts.start()
    
        tr.join()
        ts.join()
    
    if __name__ == "__main__":
        main()

    4.版本3:socket套接字 

    • udpSocket = None (对象)
    • udpSocket = “”(字符串)
    • udpSocket = 0 (数字)
    from threading import Thread
    from socket import *
    #1.收数据,然后打印
    def recvData():
        while True:
            recvInfo = udpSocket.recvfrom(1024)
            print(">>%s:%s"%(recvInfo[1],recvInfo[0]))
    
    #2.检测键盘,发数据
    def sendData():
        while True:
            sendInfo = input("<< ")
            udpSocket.sendto(sendInfo.encode("gb2312"),(destIp,destPort))
    
    udpSocket = None
    destIp = ""
    destPort = 0
    
    def main():
        global udpSocket
        global destIp
        global destPort
    
        destIp = input("对方的ip:")
        destPort = int(input("对方的port:"))
    
        udpSocket = socket(AF_INET,SOCK_DGRAM)
        udpSocket.bind(("",3456))
    
        tr = Thread(target=recvData)
        ts = Thread(target=sendData)
    
        tr.start()
        ts.start()
    
        tr.join()
        ts.join()
    
    if __name__ == "__main__":
        main()

        

        

    5.版本4:全双工 优化

          

          

    from threading import Thread
    from socket import *
    #1.收数据,然后打印
    def recvData():
        while True:
            recvInfo = udpSocket.recvfrom(1024)
            data = recvInfo[0].decode("gb2312")
            print("
    >>%s:%s"%(recvInfo[1],data),end="")
            print("
    >>")
    #2.检测键盘,发数据
    def sendData():
        while True:
            sendInfo = input("<< ")
            udpSocket.sendto(sendInfo.encode("gb2312"),(destIp,destPort))
    
    udpSocket = None
    destIp = ""
    destPort = 0
    
    def main():
        global udpSocket
        global destIp
        global destPort
    
        destIp = input("对方的ip:")
        destPort = int(input("对方的port:"))
    
        udpSocket = socket(AF_INET,SOCK_DGRAM)
        udpSocket.bind(("",7895))
    
        tr = Thread(target=recvData)
        ts = Thread(target=sendData)
    
        tr.start()
        ts.start()
    
        tr.join()
        ts.join()
    
    if __name__ == "__main__":
        main()

          

    6 问题

    • 1.print函数
    In [18]: print("ddd")
    ddd
    
    In [19]: help(print)

        

       软回车

          在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 
     的效果。
          在Linux、unix 中只表示换行,但不会回到下一行的开始位置。

       软空格:

          在Linux、unix 中表示返回到当行的最开始位置。
          在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 
     的效果。


       跳格(移至下一列)。

    它们在双引号或定界符表示的字符串中有效,在单引号表示的字符串中无效。
    
     一般一起用,用来表示键盘上的回车键,也可只用 
    。
    	表示键盘上的“TAB”键。

      文件中的换行符号: 

    linux,unix:     
     
    windows    :     
       
    Mac OS   :   
    

      

  • 相关阅读:
    python3.x元组打印错误 TypeError: unsupported operand type(s) for %: 'NoneType' and 'tuple'
    LoRa---她的简介和她的专业术语
    单片机程序在内存和FLASH中的空间分配
    STM32烧录的常用方式
    【原创】MapReduce编程系列之表连接
    Maven基础配置—本地Maven配置
    Maven基础配置--nexus私服配置
    OSGI入门笔记
    Maven仓库搭建--nexus私服
    javascript基础 方法 函数 闭包 集合
  • 原文地址:https://www.cnblogs.com/venicid/p/7978448.html
Copyright © 2011-2022 走看看