Python -- socket 实现服务器之间的通信

时间:2024-01-16 13:55:56

  现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。

  我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能)

  我的想法是:登录注册服务器主线程一直运行,监控是否有来自网关服务器的连接请求。每当接收到一次连接请求时,开辟一个新的子线程,处理来自网关服务器的消息请求,并生成访问数据库的请求消息,发送给数据库服务器,随即接收返回的数据库操作信息,子线程处理后发送登录注册结果给网关服务器。

  编程语言:Python

  网络通信方式:tcp(具体使用socket)

  数据交换格式:json

  流程图:

  代码如下:Python -- socket 实现服务器之间的通信

 Server.py

 # -*- coding: UTF-8 -*-
import socket
import datetime
import time
import json class Server(object):
"""Server Side""" def __init__(self):
self.host = '219.224.167.162'
self.port = 6999
Arr=(self.host,self.port)
self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.s.bind(Arr)
self.s.listen(5) #操作系统可以挂起的最大连接数量 def ReceiveMSG(self, threadname, sk_conn):
try:
msg_conn = sk_conn.recv(1024).decode()
data_conn= json.loads(msg_conn)
print(data_conn)
#访问数据库服务器
sk_db = socket.socket() # 创建 socket 对象
host = '219.224.167.250' # 获取数据库服务器主机名
port = 9999 # 设置端口号
sk_db.connect((host, port))
#分析客户端 登录or注册
if data_conn[0]['OP']=='login':
print(' -【登录】:',data_conn)
data=[{'OP':'login','username':'%s'%(data_conn[0]['username'])}]
msg=json.dumps(data)
sk_db.send(msg.encode())
print(' -数据库服务器返回:')
while True:
msg=sk_db.recv(1024).decode()
print(' ',msg)
if msg=='Close!':
sk_db.close()
break
if msg=='Welcome!':
continue
else:
data=json.loads(msg)
sk_db.send(b'exit')
if data[0]['password']=='None':
data=[{'code':1,'info':'Failed for error username!'}]
elif data[0]['password']!=data_conn[0]['password']:
data=[{'code':2,'info':'Failed for error password!'}]
else:
data=[{'code':3,'info':'success!'}] ##返回信息到客户端
#data=[{'code':3,'info':'success!'}]#
msg=json.dumps(data)
print(' 返回客户端信息: ',msg)
sk_conn.send(msg.encode())
sk_conn.close()
else:
print(' -【注册】:',data_conn)
data=data_conn
msg=json.dumps(data)
sk_db.send(msg.encode())
print(' -数据库服务器返回:')
while True:
msg=sk_db.recv(1024).decode()
print(' ',msg)
if msg=='Close!':
sk_db.close()
break
if msg=='Welcome!':
continue
else:
data=json.loads(msg)
sk_db.send(b'exit')
if data[0]['msg']=='success':
data=[{'code':4,'info':'success'}]
else:
data=[{'code':5,'info':'fail'}]
#data=[{'code':4,'info':'success'}]#
#返回信息到客户端
msg=json.dumps(data)
print(' 返回客户端信息: ',msg)
sk_conn.send(msg.encode())
sk_conn.close()
except BaseException:
print('An unknow error occurred.') def __delattr__(self):
self.sock.close()
self.s.close()
 LoginRegisterServer.py
主线程 # -*- coding: UTF-8 -*-
import _thread
import time
import json
from Server import Server
from Client import Client print('服务器已启动,开始提供 【登录 注册】 服务...\n')
server=Server() while True:
sk_conn,addr = server.s.accept()
print('\n请求链接用户信息:', addr) try:
_thread.start_new_thread( server.ReceiveMSG, ("Thread: deal with request.", sk_conn) )
except:
print("Error: unable to start thread")