使用socket通道和多线程创建多人对话聊天室( 三 )


客户端类的设置
客户端需要实现的功能:
两个线程:
一个线程负责发送一个线程负责接收
'''对于client需要两个线程用于收发消息所以定义两个函数,一个recv,一个send两个函数常开,当读入一个时,就发送'''class client():#chatter类def __init__(self,ip,port):self.ip=ipself.port=portself.client=socket(AF_INET,SOCK_STREAM)self.client.connect((self.ip,self.port))#发送连接请求def recv(self,locky,lis):global signwhile True:data = http://www.kingceram.com/post/self.client.recv(BUFFER)locky.acquire()lis.append(data.decode('utf-8'))locky.release()if sign==0:breakelse:print(data.decode('utf-8'))def send(self,locky,lis):global sign #赋值需要声明全局变量while True:msg = input("")locky.acquire()lis.append(msg)locky.release()if not msg:continueself.client.send(msg.encode('utf-8'))if msg == 'byebye':sign=0breakdef run(self):list=[]#保存该成员聊天记录locky=Lock()#用于保护该成员聊天记录的锁tr = Thread(target=self.recv, args=(locky,list))#由于接收转发的信息来自服务器,因此没有意义去打印ip,porttr.start()ts = Thread(target=self.send,args=(locky,list))ts.start()tr.join()ts.join()name=self.client.getsockname()[1]#getsockname返回ip地址和端口号名称self.client.close()with open(f"D:/经管大三/现代程序设计/week13/{name}_序列化.txt","wb") as f:pickle.dump(list,f)with open(f"D:/经管大三/现代程序设计/week13/{name}.txt", "w") as f:for item in list:f.write(item+'\n')
难点
其实功能实现比较简单
难点在于,梳理明白各个线程之间的关系,以及while循环什么时候跳出,如何控制while循环的跳出,怎么控制,信号在控制的时候,有没有起到作用 。
其次就是正则表达式的写法,试了有点时间
解决:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--28)(C:\Users\\\\\-user-\image-.png)]
可以看到两个线程是相对独立运行的,因此需要在内关闭服务器,另一侧无法控制
ient.()[1]#返回ip地址和端口号名称
self..close()
with open(f"D:/经管大三/现代程序设计//{name}_序列化.txt",“wb”) as f:
.dump(list,f)
with open(f"D:/经管大三/现代程序设计//{name}.txt", “w”) as f:
for item in list:
f.write(item+‘\n’)
### 难点其实功能实现比较简单难点在于,梳理明白各个线程之间的关系,以及while循环什么时候跳出,如何控制while循环的跳出,怎么控制,信号在控制的时候,有没有起到作用 。其次就是正则表达式的写法,试了有点时间**解决:**![](https://img-blog.csdnimg.cn/875c0e7d287f43138a2b496bf8330c8a.png)可以看到两个线程是相对独立运行的,因此需要在sen_client内关闭服务器,另一侧无法控制