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

 

 

 

 

  

 

转载于:https://www.cnblogs.com/venicid/p/7978448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值