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

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

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

  编程语言: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. javascript中的浅拷贝ShallowCopy与深拷贝DeepCopy

    拷贝,在js中,分为浅拷贝和深拷贝.这两者是如何区分的呢?又是如何实现的呢? 深浅拷贝的区分 首先说下,在js中,分为基础数据类型和复杂数据类型, 基础数据类型:Undefined.Null.Bool ...

  2. selenium笔记(1)

    selenium笔记(1) 一.关闭页面:1.driver.close() 关闭当前页面2.driver.quit() 退出整个浏览器 二.定位元素:1.find_element_by_id: 根据i ...

  3. jdk1.7更新visualvm插件

    所有的插件全部更新到hithub上 https://visualvm.github.io/pluginscenters.html 然后,在根据不同的JDK版本选择不同的插件地址.更改VisualVM插 ...

  4. 大数据学习之Linux进阶02

    大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...

  5. SQL Server 分区表上建立ColumnStore Index 如何添加新分区方法与步骤

    在生产环境中会遇到这样的场景,一个表随着时间的推移,越来越大,这个时候我们开始动手为这个表建立分区来改进查询性能. 但是表过大上百个G的时候,在数据仓库中,为了改进查询性能,我们可以添加在分区表的基础 ...

  6. preventDefault()、stopPropagation()、return false 的区别

    preventDefault() e.preventDefault()阻止浏览器默认事件 stopPropagation() e.stopPropagation()阻止冒泡 return false ...

  7. 英语口语练习系列-C41-食物词汇-鹊桥仙

    词汇 1, rice [raɪs] n. 稻:米饭 vt. 把-捣成米糊状 Rice: 米饭 | 大米 | 稻 2, bread [bred] n. 面包:生计 vt. 在-上洒面包屑 Bread: ...

  8. MyBatis(四)多参数处理问题

    这里总结了关于多参数传递时,MyBatis接收的三种方式. (1)接口中编写方法 public Emp getEmpByParams(Integer id,String lastNmae); publ ...

  9. CSS3 神器总结

    1. 选择类 1.1 /* 鼠标选中区域,改变背景/字体颜色 */ /*遍历写法*/ div::selection { background-color: red; color: #fff; /* f ...

  10. 一步一步 copy163: 网易严选 ---- vue-cli

    面试点 组件间通信 生命周期函数 路由 - 参数 - 重定向 vuex 参考 网易严选商城小程序全栈开发,域名备案中近期上线(mpvue+koa2+mysql) 小程序服务端源码地址 小程序源码地址 ...