• 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   :   
    

      

  • 相关阅读:
    java 多线程 继承Thread和实现Runnable的区别
    TCP和UDP的区别
    重载与覆盖(java)
    感悟
    ant design + react带有二级导航菜单自动生成
    自己搭建ant design框架
    ant design框架学习
    radio美化
    nodejs-微信公众号 ----答疑机器人
    微信小程序----开发小技巧(二)
  • 原文地址:https://www.cnblogs.com/venicid/p/7978448.html
Copyright © 2020-2023  润新知