用Python3的SocketServer模块编写一个简单的聊天程序,包括客户端与服务器端

聊天室的简单实现,不废话,直接上代码

服务器端:

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


猜你喜欢

转载自blog.csdn.net/weixin_41845533/article/details/80739978