Python実現グループチャットルーム(TCPベース)
一、サービス側コード:
1.socket,threadingの2つのモジュールが必要
2.単一プロセスマルチスレッドによる実装:
1)複数のクライアントが同時にオンラインチャットを行う
2)新しいクライアントのオンラインブロードキャスト通知他のオンラインクライアント
3)オンラインクライアントオフライン放送通知他のオンラインクライアント
4)新しいクライアントがオンラインになると、オンラインクライアントの情報を受け取る
5)各クライアントから送信された情報は、他のすべてのオンライン等のクライアントにブロードキャストされる
6)クライアントがclose()を正常に送信して終了しても、プロセスを強制的に停止しても、サービス側や他のクライアントには影響しません.
二、クライアントコード:
1.socket,threadingの2つのモジュールが必要
2.単一プロセスマルチスレッドによる実装:
1)他のクライアントからのメッセージ(サブスレッド)をリアルタイムで受信し、メインスレッドデーモンプロセスとして設定.
2)いつでも他のクライアントに情報を送信できる(プライマリスレッド)
三、配置ファイルconfig.py
実際のニーズに応じて、サービス側プログラムが傍受するポート番号を構成する.
以上:グループチャットルームの基本的な機能と論理を基本的に実現した.
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)
}
実際のニーズに応じて、サービス側プログラムが傍受するポート番号を構成する.
以上:グループチャットルームの基本的な機能と論理を基本的に実現した.