Python実現グループチャットルーム(TCPベース)


一、サービス側コード:
1.socket,threadingの2つのモジュールが必要
2.単一プロセスマルチスレッドによる実装:
1)複数のクライアントが同時にオンラインチャットを行う
2)新しいクライアントのオンラインブロードキャスト通知他のオンラインクライアント
3)オンラインクライアントオフライン放送通知他のオンラインクライアント
4)新しいクライアントがオンラインになると、オンラインクライアントの情報を受け取る
5)各クライアントから送信された情報は、他のすべてのオンライン等のクライアントにブロードキャストされる
6)クライアントがclose()を正常に送信して終了しても、プロセスを強制的に停止しても、サービス側や他のクライアントには影響しません.
import socket
import threading
import config


class Server(object):
    def __init__(self):
        #      
        self.online_pool = {}
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.server.bind(config.settings['addr_port'])

    #       
    def broadcast(self, msg):
        for i in self.online_pool:
            self.online_pool[i].send(msg.encode('gbk'))

    #        
    def login(self, client_socket, info):
        print('{} Login'.format(info))
        if len(self.online_pool) >= 1:
            self.broadcast('{}    ...'.format(info))
        self.online_pool[info] = client_socket
        #            
        msg = '      :
' for i in self.online_pool: msg += (str(i) + '
') print(msg) msg = msg.encode('gbk') client_socket.send(msg) # def logout(self, info): del self.online_pool[info] msg = '{} '.format(info) self.broadcast(msg) # def send_msg(self, info, msg): msg = msg.encode('gbk') if info in self.online_pool: self.online_pool[info].send(msg) # def session(self, client_socket, info): # , login() self.login(client_socket, info) while True: try: data = client_socket.recv(1024).decode('gbk') # 0 , secket.close() if len(data) == 0: print('{} ...'.format(info)) # self.logout(info) break else: print(info, ':', data) # , content = str(info) + ': ' data = content + data for i in self.online_pool: if i != info: self.send_msg(i, data) except Exception as err: print(err) # , , socket.close() # self.logout(info) break def start(self): self.server.listen(128) while True: client_socket, info = self.server.accept() thread = threading.Thread(target=self.session, args=(client_socket, info)) thread.setDaemon(True) thread.start() if __name__ == '__main__': print(' {} !'.format(config.settings['addr_port'])) server = Server() server.start()

二、クライアントコード:
1.socket,threadingの2つのモジュールが必要
2.単一プロセスマルチスレッドによる実装:
1)他のクライアントからのメッセージ(サブスレッド)をリアルタイムで受信し、メインスレッドデーモンプロセスとして設定.
2)いつでも他のクライアントに情報を送信できる(プライマリスレッド)
import socket
import threading


def send_msg(client):
    while True:
        msg = input('          
"0":
').strip() if msg == '0': break elif len(msg) == 0: print(' , ~!') continue msg = msg.encode('gbk') try: client.send(msg) print(' ~!') except Exception as err: print(err) def receive_msg(client): while True: try: data = client.recv(1024).decode('gbk') if len(data) == 0: print(' ...') break # continue else: print('{}'.format(data)) except Exception as err: print(err) break if __name__ == '__main__': # socket tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket tcp_client.connect(('192.168.31.30', 8888)) recv_theard = threading.Thread(target=receive_msg, args=(tcp_client,)) recv_theard.setDaemon(True) recv_theard.start() # , recv() # , input() send_msg(tcp_client) tcp_client.close()

三、配置ファイルconfig.py
settings = {
    'addr_port': ('0.0.0.0', 8888)
}

実際のニーズに応じて、サービス側プログラムが傍受するポート番号を構成する.
 
以上:グループチャットルームの基本的な機能と論理を基本的に実現した.