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   :   
    

      

  • 相关阅读:
    自动化测试成功11333
    自动化测试成功11222
    自动化测试成功1111
    自动化测试成功112
    自动化测试成功18
    自动化测试成功1
    自动化测试成功
    富文本测试
    关于VMware虚拟机磁盘收缩的几种方法
    8个让你更有效率的简单方法
  • 原文地址:https://www.cnblogs.com/venicid/p/7978448.html
Copyright © 2011-2022 走看看