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

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

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

  编程语言:Python

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

  数据交换格式:json

  流程图:

  代码如下:

 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")

Python -- socket 实现服务器之间的通信的更多相关文章

  1. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  2. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  3. python socket连接服务器获取回显

    军训回来了,皮皮..... import socket import sys try: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个 ...

  4. Web浏览器与Web服务器之间的通信过程

     HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1:建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  5. 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...

  6. pomelo 服务器之间的通信

    master服务器在启动的时候会启动mater服务,生成一个MasterAgent,作为中心服务器. 然后所有服务器,包括mater服务器,都会启动monitor服务,生成一个MonitorAgent ...

  7. socket,模拟服务器、客户端通信

    服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...

  8. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  9. python socket和简单tcp通信实现

    python 服务端和客户端的简单交互 TCP服务端: 1 创建套接字,绑定套接字到本地IP与端口 s = socket.socket(socket.AF_INET,socket.SOCK_STREA ...

随机推荐

  1. 基于.net的分布式系统限流组件(限流算法:令牌算法和漏斗算法)

    转载链接:https://www.cnblogs.com/vveiliang/p/9049393.html 1.令牌桶算法 令牌桶算法是比较常见的限流算法之一,大概描述如下: 1).所有的请求在处理之 ...

  2. SQL Server SubString和charindex的用法

    语法 SUBSTRING ( expression , start , length ) 参数 expression 是字符串.二进制字符串.text.image.列或包含列的表达式.不要使用包含聚合 ...

  3. Windows下python2与python3兼容设置

    分别安装python2与python3后,我想直接通过命令python2.pip2与python3.pip3区分: 分别进入python安装目录下,修改python.exe为python2.exe.p ...

  4. Do Now 一个让你静心学习的APP——团队博客

    Do Now 一个让你静心学习的APP 来自油条只要半根团队的智慧凝聚的产物! 团队博客总目录: 团队作业第一周 团队作业第二周 Do Now -- 团队冲刺博客一 Do-Now-团队Scrum 冲刺 ...

  5. mvc 路由配置

    1.URL模式 路由系统用一组路由来实现它的功能,这些路由共同组成了应用系统URL架构或方案,这种URL架构是应用程序能够识别并能对之做出响应的一组URL,当处理一个输入 请求时,路由系统的工作是将这 ...

  6. PHP通过经纬坐标计算两个地址的距离

    <?php /** *求两个已知经纬度之间的距离,单位为米 * *@param lng1,lng2 经度 * *@param lat1,lat2 纬度 * *@return float 距离,单 ...

  7. md5 加密文件

    import hashlibimport os def get_md5(file_path): md5 = None if os.path.isfile(file_path): f = open(fi ...

  8. GYM 101617 F

    说到这题还要提到周日下午训练赛,都进去了hmc说他这场单切过准备换一场. 很不幸的是我当时已经开了这个几何题, 开场就开几何是什么鬼啊!!! 给你n个圆,找一点在所有园内并且离原点最远.(保证有解) ...

  9. cf 744D

    一开始没看懂题解,想了好久(一整天)才想明白是枚举弦上点二分半径check角度,看了下clj的代码发现思路都一样就开始写了. 借鉴了一下clj的代码. 调了一个多小时. 几个注意点:看到好多 rand ...

  10. 替换url中的域名

    /**     *      * @param domain 域名     * @param port   端口号     * @param url    url路径     * @return   ...