现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。
我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能)
我的想法是:登录注册服务器主线程一直运行,监控是否有来自网关服务器的连接请求。每当接收到一次连接请求时,开辟一个新的子线程,处理来自网关服务器的消息请求,并生成访问数据库的请求消息,发送给数据库服务器,随即接收返回的数据库操作信息,子线程处理后发送登录注册结果给网关服务器。
编程语言: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")