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

  

最新文章

  1. python 局部变量和全局变量 global
  2. IOS第18天(5,CABasicAnimation基本动画)
  3. 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)
  4. ApacheBench(ab)使用详解
  5. GCD时间轴
  6. algorithm@ Matrix fast power
  7. 开发移动端web的一些知识
  8. DirectX:函数连接两个随机filter
  9. 使用Perl提取Excel中的IO_MUX
  10. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
  11. 使用TransactionScope做分布式事务协调
  12. Git Bash
  13. IPC 简说
  14. PHP 判断字符串括号是否匹配
  15. jQuery 学习笔记2 点击时弹出一个对话框
  16. Java将json字符串转成map
  17. Delphi 判断TImage是否为空及注意事项
  18. groovy动态类型--能力式设计
  19. map::erase陷阱
  20. 解题报告:poj 3264 最基本的线段树

热门文章

  1. codis学习
  2. memset赋初值的运用
  3. 什么是微信小程序
  4. div可编辑框,去除粘贴文字样式&#128516;
  5. Android学习笔记_70_一个应用程序启动另一个应用程序的Activity
  6. HDU 1254 推箱子(BFS加优先队列)
  7. java流汇总以及使用实例
  8. JavaScript js调用堆栈(三)
  9. Python基础—05-总结:双重循环,数据类型
  10. nodejs+express开发blog(2)