現在需要做一個分散式課程設計(簡單小游戲),三個人小組合作完成。 我需要設計一個登錄註冊伺服器,接收來自網關伺服器(消息中間件)的用戶登錄註冊消息請求,然後生成訪問資料庫伺服器的消息,發送給資料庫伺服器,接收並處理其返回信息,發送登錄註冊結果給網關伺服器。(很簡單的功能) 我的想法是:登錄註冊伺服器 ...
現在需要做一個分散式課程設計(簡單小游戲),三個人小組合作完成。
我需要設計一個登錄註冊伺服器,接收來自網關伺服器(消息中間件)的用戶登錄註冊消息請求,然後生成訪問資料庫伺服器的消息,發送給資料庫伺服器,接收並處理其返回信息,發送登錄註冊結果給網關伺服器。(很簡單的功能)
我的想法是:登錄註冊伺服器主線程一直運行,監控是否有來自網關伺服器的連接請求。每當接收到一次連接請求時,開闢一個新的子線程,處理來自網關伺服器的消息請求,並生成訪問資料庫的請求消息,發送給資料庫伺服器,隨即接收返回的資料庫操作信息,子線程處理後發送登錄註冊結果給網關伺服器。
編程語言:Python
網路通信方式:tcp(具體使用socket)
數據交換格式:json
流程圖:
代碼如下:
1 Server.py 2 3 # -*- coding: UTF-8 -*- 4 import socket 5 import datetime 6 import time 7 import json 8 9 class Server(object): 10 """Server Side""" 11 12 def __init__(self): 13 self.host = '219.224.167.162' 14 self.port = 6999 15 Arr=(self.host,self.port) 16 self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 17 self.s.bind(Arr) 18 self.s.listen(5) #操作系統可以掛起的最大連接數量 19 20 def ReceiveMSG(self, threadname, sk_conn): 21 try: 22 msg_conn = sk_conn.recv(1024).decode() 23 data_conn= json.loads(msg_conn) 24 print(data_conn) 25 #訪問資料庫伺服器 26 sk_db = socket.socket() # 創建 socket 對象 27 host = '219.224.167.250' # 獲取資料庫伺服器主機名 28 port = 9999 # 設置埠號 29 sk_db.connect((host, port)) 30 #分析客戶端 登錄or註冊 31 if data_conn[0]['OP']=='login': 32 print(' -【登錄】:',data_conn) 33 data=[{'OP':'login','username':'%s'%(data_conn[0]['username'])}] 34 msg=json.dumps(data) 35 sk_db.send(msg.encode()) 36 print(' -資料庫伺服器返回:') 37 while True: 38 msg=sk_db.recv(1024).decode() 39 print(' ',msg) 40 if msg=='Close!': 41 sk_db.close() 42 break 43 if msg=='Welcome!': 44 continue 45 else: 46 data=json.loads(msg) 47 sk_db.send(b'exit') 48 if data[0]['password']=='None': 49 data=[{'code':1,'info':'Failed for error username!'}] 50 elif data[0]['password']!=data_conn[0]['password']: 51 data=[{'code':2,'info':'Failed for error password!'}] 52 else: 53 data=[{'code':3,'info':'success!'}] 54 55 ##返回信息到客戶端 56 #data=[{'code':3,'info':'success!'}]# 57 msg=json.dumps(data) 58 print(' 返回客戶端信息: ',msg) 59 sk_conn.send(msg.encode()) 60 sk_conn.close() 61 else: 62 print(' -【註冊】:',data_conn) 63 data=data_conn 64 msg=json.dumps(data) 65 sk_db.send(msg.encode()) 66 print(' -資料庫伺服器返回:') 67 while True: 68 msg=sk_db.recv(1024).decode() 69 print(' ',msg) 70 if msg=='Close!': 71 sk_db.close() 72 break 73 if msg=='Welcome!': 74 continue 75 else: 76 data=json.loads(msg) 77 sk_db.send(b'exit') 78 if data[0]['msg']=='success': 79 data=[{'code':4,'info':'success'}] 80 else: 81 data=[{'code':5,'info':'fail'}] 82 #data=[{'code':4,'info':'success'}]# 83 #返回信息到客戶端 84 msg=json.dumps(data) 85 print(' 返回客戶端信息: ',msg) 86 sk_conn.send(msg.encode()) 87 sk_conn.close() 88 except BaseException: 89 print('An unknow error occurred.') 90 91 def __delattr__(self): 92 self.sock.close() 93 self.s.close()
1 LoginRegisterServer.py 2 主線程 3 4 # -*- coding: UTF-8 -*- 5 import _thread 6 import time 7 import json 8 from Server import Server 9 from Client import Client 10 11 print('伺服器已啟動,開始提供 【登錄 註冊】 服務...\n') 12 server=Server() 13 14 while True: 15 sk_conn,addr = server.s.accept() 16 print('\n請求鏈接用戶信息:', addr) 17 18 try: 19 _thread.start_new_thread( server.ReceiveMSG, ("Thread: deal with request.", sk_conn) ) 20 except: 21 print("Error: unable to start thread")