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

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

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

  编程语言: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. 指定的 CGI 应用程序遇到错误,服务器终止了该进程。

    遇到这种错误只需要把这个项目的Cookies删除再重新启动就行了

  2. Linux中CPU亲和性(affinity)

    0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和 ...

  3. JAVA基础复习与总结<六> 数组_容器_泛型

    数组的常用方法 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: 给数组赋值:通过 fill 方法. 对数组排序:通过 sort 方法,按升序. 比较 ...

  4. Mysql更新关联子查询报错

    报错内容:sql  1093 - You can't specify target table 'u' for update in FROM clause 错误原因: if you're doing ...

  5. PHP命名空间与自动加载类详解

    本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...

  6. linux 做了raid后,硬盘坏了更换问题

    系统做完raid1后发现 raid盘坏了,硬盘都是热插拔的,更换后,需要简单配置一下才能自动进行镜像拷贝. 在pd mgmt 页面,选择新加入的硬盘,按F2,选择 make global HS选项 选 ...

  7. H5测试点总结-UI测试、功能测试、兼容性测试、体验相关(弱网、资源、手机操作等)、安全性测试、性能测试

    一.概述 1.1 什么是H5 H5 即 HTML5,是最新的 Web 端开发语言版本,现如今,大多数手机 APP 页面会用 H5 实现,包括 PC Web 站点也会用它开发实现.所以 Web 的通用测 ...

  8. Round #4 RMQ问题ST算法

    前几天群里看到有人问[JSOI2008]最大数,一道很简单的问题,线段树无脑做,但是看到了动态ST,emmm,学学吧,听大佬说了下思路,还好,不难的: 四道题都可以用其他数据结构或做法代替,例如线段树 ...

  9. CDN(Content Delivery Network)技术原理概要

    简介 CDN(Content Delivery Network)即内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能,使用户就近获取所需内容,提高用户访问响应速度和 ...

  10. 过滤html标签

    public static String delHTMLTag(String htmlStr){ String regEx_script="<script[^>]*?>[\ ...