Python -- socket 實現服務器之間的通訊

  如今須要作一個分佈式課程設計(簡單小遊戲),三我的小組合做完成。數據庫

  我須要設計一個登陸註冊服務器,接收來自網關服務器(消息中間件)的用戶登陸註冊消息請求,而後生成訪問數據庫服務器的消息,發送給數據庫服務器,接收並處理其返回信息,發送登陸註冊結果給網關服務器。(很簡單的功能)編程

  個人想法是:登陸註冊服務器主線程一直運行,監控是否有來自網關服務器的鏈接請求。每當接收到一次鏈接請求時,開闢一個新的子線程,處理來自網關服務器的消息請求,並生成訪問數據庫的請求消息,發送給數據庫服務器,隨即接收返回的數據庫操做信息,子線程處理後發送登陸註冊結果給網關服務器。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")
相關文章
相關標籤/搜索