现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。
我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能)
我的想法是:登录注册服务器主线程一直运行,监控是否有来自网关服务器的连接请求。每当接收到一次连接请求时,开辟一个新的子线程,处理来自网关服务器的消息请求,并生成访问数据库的请求消息,发送给数据库服务器,随即接收返回的数据库操作信息,子线程处理后发送登录注册结果给网关服务器。
如果你在学习Python的过程当中有遇见任何问题,可以加入我的python交流学习qq群:683380553,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我,如果你准备学习大数据,也欢迎加入大数据学习交流qq群683380553,每天与大家分享学习资源哦。
编程语言:Python
网络通信方式:tcp(具体使用socket)
数据交换格式:json
流程图:
代码如下:
<tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1555229075398" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image<input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>
<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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")
</pre>
网友评论