原理
见上一篇,服务端的博文
客户端的代码
from socket import *
import threading
import time
import atexit
class Client(object):
def __init__(self):
a = input('请输入用户名:')
self.name = a
#可以设置需要的用户的信息
def getname(self):
return self.name
class ChatRoom_c(object):
def __init__(self):
'''
初始化变量
'''
self.server_addr = ('127.0.0.1',8899)
self.client = Client()
self.s = None
def connect(self):
'''
连接到服务器
'''
self.s = socket()
self.s.connect(self.server_addr)
#第一次连接的时候,把用户名发过去
self.send(f'[name] {self.client.name}')
def send(self,message):
'''
发送消息
'''
self.s.send(message.encode('utf-8'))
def recv(self):
'''
接收服务器发送过来的消息
'''
a = self.s.recv(1024)
return a.decode('utf-8')
def loop_send(self):
'''
循环发送消息
'''
while True:
a = input()
self.send(a)
def loop_recv(self):
'''
一直循环的接受服务器发过来的消息,并打印出来
'''
while True:
a = self.recv()
print(a)
time.sleep(1)
def main(self):
'''
连接,然后开启两个线程,一直获取服务器的消息,一边可以输入发给服务器
不用join()让主线程等待子线程是为了,在你结束的时候,可以正常的结束所有子线程
'''
self.connect()
a = threading.Thread(target=self.loop_send)
b = threading.Thread(target=self.loop_recv)
a.start()
b.start()
def clean(self):
'''
程序结束时,告诉服务器我离开聊天室,然后关闭socket
'''
print('程序退出了...')
self.send('[stop]')
self.s.close()
if __name__ == "__main__":
a = ChatRoom_c()
a.main()
atexit.register(a.clean)
使用方法(linux中)
- 把服务端代码保存,如 Server.py
- 把客户端代码保存,如Client.py
- 先运行Server
python3 Server.py
- 另一个终端,运行Client
python3 Client.py
,输入用户名,如kalpa - 多运行几个Client,自己决定多少个,开启另外的终端,重复上一步
- 在其中一个Client输入消息
- 此时可以在Server终端看到收到了消息,然后除了发送的Client,其他的Client也收到了消息
- Client要退出时,使用Ctrl-C退出程序,此时,会发送一个TCP告诉服务器我要退出,然后关闭套接字
- 不退出,可重复6