5 多线程 模拟qq聊天

Posted 不要被骄傲遮蔽了双眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\\r>>%s:%s"%(recvInfo[1],data),end="")
        print("\\r>>")
#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)

 

    

 

  \\n 软回车

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

  \\r 软空格:

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


  \\t 跳格(移至下一列)。

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

 

  文件中的换行符号: 

linux,unix:     \\r\\n 
windows    :     \\n   
Mac OS   :   \\r

 

 

 

 

  

 

以上是关于5 多线程 模拟qq聊天的主要内容,如果未能解决你的问题,请参考以下文章

多个请求是多线程吗

多线程编程

Java多线程学习笔记

Java 多线程

多个用户访问同一段代码

Socket编程 ------ 模拟QQ聊天工具