Python -- socket 实现服务器之间的通信
程序员文章站
2022-07-06 23:18:04
现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。 我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能) 我的想法是:登录注册服务器 ......
现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。
我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能)
我的想法是:登录注册服务器主线程一直运行,监控是否有来自网关服务器的连接请求。每当接收到一次连接请求时,开辟一个新的子线程,处理来自网关服务器的消息请求,并生成访问数据库的请求消息,发送给数据库服务器,随即接收返回的数据库操作信息,子线程处理后发送登录注册结果给网关服务器。
编程语言: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")
上一篇: 为什么Python在列表和元组的末尾允许使用逗号?
下一篇: Django Admin管理入门