聊天室的简单实现,不废话,直接上代码
服务器端:
from socketserver import TCPServer, ThreadingMixIn, StreamRequestHandler
from linux_time import datetime_now
class Server(ThreadingMixIn, TCPServer):
def __init__(self, server_address, RequestHandlerClass):
TCPServer.__init__(
self, server_address, RequestHandlerClass)
self.users = {}
class MyHandler(StreamRequestHandler):
def handle(self):
self.addr = self.request.getpeername()
self.server.users[self.addr[1]] = self.request
message = "用户" + self.addr[0] + ":" + str(self.addr[1]) + \
" " + datetime_now() + "加入了频道"
print(message)
self.broadCast("加入了频道")
while True:
try:
data = self.request.recv(1024).decode()
if data == "quit" or data == "":
del self.server.users[self.addr[1]]
break
print((("用户" + self.addr[0] + ":" + str(self.addr[1]) +
" " + datetime_now() + " >> " + str(data))))
self.broadCast(data)
except:
raise
break
self.request.close()
message2 = "用户" + self.addr[0] + ":" + str(self.addr[1]) + \
" " + datetime_now() + "离开了频道"
print(message2)
self.broadCast("离开了频道")
def broadCast(self, message):
for user, output in self.server.users.items():
output.send(("用户" + self.addr[0] + ":" + str(self.addr[1]) +
" " + datetime_now() + " >> " + str(message)).encode())
if __name__ == "__main__":
host = ""
port = 1234
server = Server((host, port), MyHandler)
server.serve_forever()
客户端:
import socket
import sys
from threading import Thread
class ChatClient:
def __init__(self):
self.s = socket.socket()
server = socket.gethostname()
port = 1234
self.s.connect((server, port)) # 连接服务器
self.run()
def run(self):
prepareRecv = self.PrepareRecv(self.s)
prepareRecv.start()
while True:
data = input("")
try:
self.s.send(data.encode())
if data == "quit":
break
except:
print("与服务器连接中断!")
break
self.s.close() # 关闭连接
class PrepareRecv(Thread):
def __init__(self, _socket):
Thread.__init__(self)
self.setDaemon = True # 主线程结束终止子线程
self._socket = _socket
def run(self):
while True:
try:
readText = self._socket.recv(1024).decode()
if readText == "":
self._socket.close()
break
else:
print(readText)
except:
self._socket.close()
break
if __name__ == '__main__':
ChatClient()
效果图:
参考资料:
https://blog.csdn.net/zzhtheone/article/details/20533941