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

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

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

  编程语言: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. 用Python建立连接直接读取与更改Rockwell Control Logix Controller的tag值

    请参考如下连接的开源项目 源代码在本地测试好用. 注: 这里所用的Python 版本是 2.7.11 https://github.com/dmroeder/pylogix

  2. 西风 West Wind Html帮助构建器

    https://helpbuilder.west-wind.com/ 示例文档: https://helpbuilder.west-wind.com/docs/_03101e5wp.htm

  3. HTTP/1.1 chunked 解码

    0.简介 1.定义 RFC定义 https://tools.ietf.org/html/rfc2616#section-3.6.1 Chunked-Body = *chunk last-chunk t ...

  4. linux学习之命令的排列、替换和别名--2019-04-23

    1.命令的排列 1)使用“;” 使用“;”命令时,不管命令1是否出错,接下来都执行命令2. 2)使用“&&” 使用“&&”命令时,只有命令1正确运行,接下来才会执行命令 ...

  5. idea通过mapper快速定位到xml文件

    1.点击File找到设置(Settings) 2.点击Plugins下的 Browse respositories 3.在搜索栏搜索mybatis ,选中 Free Mybatis plugin——i ...

  6. 启动两个tomcat服务,以及使用nginx代理实现访问

    1.shoudowm.bat\startup.bat\catalina.bat, 将CATALINA_HOME修改为CATALINA_HOME_2 2.server.xml <Server po ...

  7. powershell_基础篇

    powershell 想必大家对windows操作系统下的cmd命令提示符可能并不陌生,大多数人都应该使用过它.而对于今天我们要学习的PowerShell跟cmd有什么关系呢?可以简单地说,Power ...

  8. MyBatis3系列__04CRUD以及参数处理

    本文将会简单介绍一下MyBatis的CRUD以及结合源码讲解一下MyBatis对参数的处理. 作为一个ORM框架,最基本的使用也就是CRUD了,MyBatis提供了两种方法:xml配置文件和动态注解. ...

  9. 理解JavaScript【转】

    第一题 if (!("a" in window)) {     var a = 1; } alert(a); 第二题 var a = 1,     b = function a(x ...

  10. 基于用户协同过滤--UserCF

    UserCF  本系列文章主要介绍推荐系统领域相关算法原理及其实现.本文以项亮大神的<推荐系统实践>作为切入点,介绍推荐系统最基础的算法(可能也是最好用的)--基于用户的协同过滤算法(Us ...