码迷,mamicode.com
首页 > 编程语言 > 详细

5 多线程 模拟qq聊天

时间:2017-12-04 20:32:07      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:stp   get   ==   mac   分享图片   数字   str   位置   聊天   

 

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聊天

标签:stp   get   ==   mac   分享图片   数字   str   位置   聊天   

原文地址:http://www.cnblogs.com/venicid/p/7978448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!