#coding=utf-8 from threading import Thread from time import sleep def func1(name): print(f"线程{name},start") for i in range(3): print(f"线程:{name},{i}") sleep(5) print(f"线程{name},end") if __name__ == '__main__': print("主线程,start") #创建线程 t1 = Thread(target=func1,args=("t1,")) t2 = Thread(target=func1,args=("t2,")) #启动线程 t1.start() t2.start() print("主线程,end")
老师 这个是怎么回事呢
# 服务器端:一个线程专门发送消息,一个线程专门接收消息。 # 客户端:一个线程专门发送消息,一个线程专门接收消息。 # 结合多线程实现TCP双向传送(自由聊天) # 【示例】TCP服务端结合多线程实现自由收发信息 from socket import * from threading import Thread def recv_data(): while True: # 读取客户端的消息 re_data = tcp_client_socket.recv(1024) re_content =re_data.decode('gbk') # 将消息输出到控制台 print(f"客户端说:{re_content},from:{host}") if re_content == '88': break # 获取控制台信息 def send_data(): while True: msg = input(">") tcp_client_socket.send(msg.encode("gbk")) if __name__ == '__main__': tcp_server_socket = socket(AF_INET, SOCK_STREAM) tcp_server_socket.bind(('127.0.0.1', 8888)) tcp_server_socket.listen() print("服务端已经启动,等待客户端连接!") tcp_client_socket, host = tcp_server_socket.accept() print("一个客户端建立连接成功!") t1 = Thread(target=recv_data()) t2 = Thread(target=send_data()) t1.start() t2.start() t1.join() t2.join() tcp_client_socket.close() tcp_server_socket.close() from socket import * from threading import Thread def recv_data(): while True: redata=tcp_client_socket.recv(1024) recv_data=redata.decode('gbk') print(f"服务器端说:{recv_data}") def send_data(): while True: msg=input(">") tcp_client_socket.send(msg.encode("gbk")) if msg == '88': break if __name__ == '__main__': tcp_client_socket=socket(AF_INET,SOCK_STREAM) tcp_client_socket.connect(('127.0.0.1',8888)) print("连接建立成功") t1=Thread(target=recv_data()) t2=Thread(target=send_data()) t1.start() t2.start() t1.join() t2.join() tcp_client_socket.close() 这个持续通信中的发送消息接收信息判断为什么不生效,当输入88的时候
#coding=utf-8 '''双向通信Socket之客户端 将控制台输入的信息发送给服务器端 读取服务器端的数据,将内容输出到控制台''' from socket import * tcp_client_socket=socket(AF_INET,SOCK_STREAM) tcp_client_socket.connect(('127.0.0.1',8888)) while True: msg=input(">") tcp_client_socket.send(msg.encode("gbk")) if msg=='end': break redata=tcp_client_socket.recv(1024) recv_data=redata.decode('gbk') print(f"服务器端说:{recv_data}") tcp_client_socket.close() # TCP双向持续通信 # 【示例】TCP:双向通信Socket之服务器端 #coding=utf-8 from socket import * tcp_server_socket=socket(AF_INET,SOCK_STREAM) tcp_server_socket.bind(('127.0.0.1',8888)) tcp_server_socket.listen(5) print("服务端已经启动,等待客户端连接!") tcp_client_socket,host=tcp_server_socket.accept() print("一个客户端建立连接成功!") while True: re_data = tcp_server_socket.recv(1024) re_content =re_data.decode('gbk') print(f"客户端说:{re_content},from:{host}") if re_content == 'end': break msg = input(">") tcp_server_socket.send(msg.encode("gbk")) tcp_client_socket.close() tcp_server_socket.close() 客户端运行输入报错 >121 Traceback (most recent call last): File "C:/Users/Administrator/Desktop/python代码练习/udp.py", line 68, in <module> redata=tcp_client_socket.recv(1024) ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。 这个是为什么啊
'''【示例】UDP接收数据''' #coding=utf-8 from socket import * s=socket(AF_INET,SOCK_DGRAM)#创建套接字 s.bind(("127.0.0.1",8888)) print("等待接收数据!") redata =s.recvfrom(1024)#1024表示本次接收的最⼤字节数,s.recvfrom() '''接收UDP数据,与recv()类似,但返回值是 (data,address)。其中data是包含接收数据的字符 串,address是发送数据的套接字地址。''' print(f"收到远程消息:{redata[0]},from {redata[1]}") s.close() 运行结果
请输入:付水电费第三方第三方
print为什么一直打印不了
#encoding=utf-8 from time import sleep from queue import Queue from threading import Thread def producer(): num=1 while True: if queue.qsize()<3: print(f"生产{num}号大馒头") queue.put(f"将{num}号馒头放进框中") num+=1 else: print("馒头框满了,等待来人消费啊!") sleep(1) def consumer(): while True: print(f"获取{queue.get()}") sleep(1) if __name__ == '__main__': queue=Queue() t=Thread(target=producer) t.start() c=Thread(target=consumer) c.start()
老师,这里的queue.get()返回的是什么内容啊,是queue.put()中的字符串么?
#未使用线程同步和互斥锁的情况 from threading import Thread from time import sleep class Account: def __init__(self,money,name): self.money=money self.name=name #模拟提款的操作 class Drawing(Thread):#继承Thread类 def __init__(self,drawingNum,account): Thread.__init__(self)#包含调用父类构造函数 self.drawingNum=drawingNum self.account=account self.expenseTotal=0 def run(self): if self.account.money < self.drawingNum: return #结束函数 sleep(1)#判断完可以取钱,则阻塞,就是为了测试发生冲突问题 self.account.money-=self.drawingNum self.expenseTotal+=self.drawingNum print(f"账户:{self.account.name},余额是:{self.account.money}") print(f"账户:{self.account.name},总共取了:{self.expenseTotal}") if __name__ == '__main__': a1=Account(100,"gaoqi")#实例化对象 draw1=Drawing(80,a1)#实例化对象,并将a1作为参数传入 draw2=Drawing(80,a1) draw1.start() draw2.start()
老师,这里最终为什么总共不是取了160?draw1和draw2传入的第二个参数是同一个对象a1,是不是因为执行draw2线程时又把self.expenseTotal=0重定义了,所以还是一共取了80?
老师,这是什么原因呢?
一脸懵逼,讲一大堆理论
老师我怎么感觉我的VScode怪怪的要全选才可以把代码运行,直接运行就报错
为什安装有greenlet 但是无法调用咧
这里为什么要用循环啊,不太
明白
老师必须用vs吗
老师好 pycharm里面没有greenlet模块怎么操作呢
老师你好!我想知道向服务器发送确认的这部分代码为什么是放在判断是否最后一次数据传送的后面呢?如果这样,break停止整个循环,最后小于516字节的那一部分就不需要发送ACK确认信息了吗?那这样服务器怎么判定数据包是否丢失呢?
老师print(m_list)放在with manager里和外得出的结论是不一样的
放在with manager外的话代表的是什么,区别是什么
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战未来微信公众号
百战未来微信小程序
©2014-2026百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637