如今須要作一個分佈式課程設計(簡單小遊戲),三我的小組合做完成。數據庫
我須要設計一個登陸註冊服務器,接收來自網關服務器(消息中間件)的用戶登陸註冊消息請求,而後生成訪問數據庫服務器的消息,發送給數據庫服務器,接收並處理其返回信息,發送登陸註冊結果給網關服務器。(很簡單的功能)編程
個人想法是:登陸註冊服務器主線程一直運行,監控是否有來自網關服務器的鏈接請求。每當接收到一次鏈接請求時,開闢一個新的子線程,處理來自網關服務器的消息請求,並生成訪問數據庫的請求消息,發送給數據庫服務器,隨即接收返回的數據庫操做信息,子線程處理後發送登陸註冊結果給網關服務器。json
編程語言:Python 服務器
網絡通訊方式:tcp(具體使用socket)網絡
數據交換格式:jsonsocket
流程圖:tcp
代碼以下:編程語言
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")