zoukankan      html  css  js  c++  java
  • Python -- socket 实现服务器之间的通信

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

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

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

      编程语言:Python 

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

      数据交换格式:json

      流程图:

      代码如下:

     1 Server.py
     2 
     3 # -*- coding: UTF-8 -*-
     4 import socket
     5 import datetime
     6 import time
     7 import json
     8 
     9 class Server(object):
    10     """Server Side"""
    11     
    12     def __init__(self):
    13         self.host = '219.224.167.162'
    14         self.port = 6999
    15         Arr=(self.host,self.port)
    16         self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    17         self.s.bind(Arr)
    18         self.s.listen(5) #操作系统可以挂起的最大连接数量
    19         
    20     def ReceiveMSG(self, threadname, sk_conn):
    21         try:
    22             msg_conn = sk_conn.recv(1024).decode()
    23             data_conn= json.loads(msg_conn)
    24             print(data_conn)
    25             #访问数据库服务器
    26             sk_db = socket.socket()        # 创建 socket 对象
    27             host = '219.224.167.250'    # 获取数据库服务器主机名
    28             port = 9999                 # 设置端口号
    29             sk_db.connect((host, port))
    30             #分析客户端 登录or注册
    31             if data_conn[0]['OP']=='login':
    32                 print('  -【登录】:',data_conn)
    33                 data=[{'OP':'login','username':'%s'%(data_conn[0]['username'])}]
    34                 msg=json.dumps(data)
    35                 sk_db.send(msg.encode())
    36                 print('  -数据库服务器返回:')
    37                 while True:
    38                     msg=sk_db.recv(1024).decode()
    39                     print('    ',msg)
    40                     if msg=='Close!':
    41                         sk_db.close()
    42                         break
    43                     if msg=='Welcome!':
    44                         continue
    45                     else:
    46                         data=json.loads(msg)
    47                         sk_db.send(b'exit')
    48                         if data[0]['password']=='None':
    49                             data=[{'code':1,'info':'Failed for error username!'}]
    50                         elif data[0]['password']!=data_conn[0]['password']:
    51                             data=[{'code':2,'info':'Failed for error password!'}]
    52                         else:
    53                             data=[{'code':3,'info':'success!'}]
    54                  
    55                 ##返回信息到客户端
    56                 #data=[{'code':3,'info':'success!'}]#
    57                 msg=json.dumps(data)
    58                 print('    返回客户端信息: ',msg)
    59                 sk_conn.send(msg.encode())
    60                 sk_conn.close()
    61             else:
    62                 print('  -【注册】:',data_conn)
    63                 data=data_conn
    64                 msg=json.dumps(data)
    65                 sk_db.send(msg.encode())
    66                 print('  -数据库服务器返回:')
    67                 while True:
    68                     msg=sk_db.recv(1024).decode()
    69                     print('    ',msg)
    70                     if msg=='Close!':
    71                         sk_db.close()
    72                         break
    73                     if msg=='Welcome!':
    74                         continue
    75                     else:
    76                         data=json.loads(msg)
    77                         sk_db.send(b'exit')
    78                         if data[0]['msg']=='success':
    79                             data=[{'code':4,'info':'success'}]
    80                         else:
    81                             data=[{'code':5,'info':'fail'}]
    82                 #data=[{'code':4,'info':'success'}]#
    83                 #返回信息到客户端
    84                 msg=json.dumps(data)
    85                 print('    返回客户端信息: ',msg)
    86                 sk_conn.send(msg.encode())
    87                 sk_conn.close()
    88         except BaseException:
    89              print('An unknow error occurred.')
    90             
    91     def __delattr__(self):
    92         self.sock.close()
    93         self.s.close()
     1 LoginRegisterServer.py
     2 主线程
     3 
     4 # -*- coding: UTF-8 -*-
     5 import _thread
     6 import time
     7 import json
     8 from Server import Server
     9 from Client import Client
    10 
    11 print('服务器已启动,开始提供 【登录 注册】 服务...
    ')
    12 server=Server()
    13 
    14 while True:
    15     sk_conn,addr = server.s.accept()
    16     print('
    请求链接用户信息:', addr)
    17     
    18     try:
    19         _thread.start_new_thread( server.ReceiveMSG, ("Thread: deal with request.", sk_conn) )
    20     except:
    21         print("Error: unable to start thread")
  • 相关阅读:
    动态SQL的注意
    关于数据库抛出异常:Incorrect string value: 'xE1x...' for column '字段名' at row 1 问题的解决方法
    让.bashrc文件在终端自动生效
    期中考试题
    RAP、Mock.js、Vue.js、Webpack
    全局变量变为局部变量 & MVC思想
    用 JS + LeanCloud 给网页添加数据库(留言功能)
    闭包的使用
    从发请求到AJAX到同源政策
    从实现HTML页面局部刷新到JSONP
  • 原文地址:https://www.cnblogs.com/chen9510/p/10692523.html
Copyright © 2011-2022 走看看