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