美文网首页大数据 爬虫Python AI SqlPython小哥哥
Python -- socket 实现服务器之间的通信!

Python -- socket 实现服务器之间的通信!

作者: 14e61d025165 | 来源:发表于2019-04-14 16:05 被阅读0次

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

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

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

    如果你在学习Python的过程当中有遇见任何问题,可以加入我的python交流学习qq群:683380553,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我,如果你准备学习大数据,也欢迎加入大数据学习交流qq群683380553,每天与大家分享学习资源哦。

    编程语言:Python

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

    数据交换格式:json

    流程图:

    代码如下:

    <tt-image data-tteditor-tag="tteditorTag" contenteditable="false" class="syl1555229075398" data-render-status="finished" data-syl-blot="image" style="box-sizing: border-box; cursor: text; color: rgb(34, 34, 34); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", "Helvetica Neue", Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: block;"> image

    <input class="pgc-img-caption-ipt" placeholder="图片描述(最多50字)" value="" style="box-sizing: border-box; outline: 0px; color: rgb(102, 102, 102); position: absolute; left: 187.5px; transform: translateX(-50%); padding: 6px 7px; max-width: 100%; width: 375px; text-align: center; cursor: text; font-size: 12px; line-height: 1.5; background-color: rgb(255, 255, 255); background-image: none; border: 0px solid rgb(217, 217, 217); border-radius: 4px; transition: all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) 0s;"></tt-image>

    <pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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('服务器已启动,开始提供 【登录 注册】 服务...\n')
    12 server=Server()
    13
    14 while True:
    15 sk_conn,addr = server.s.accept()
    16 print('\n请求链接用户信息:', 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")
    </pre>

    相关文章

      网友评论

        本文标题:Python -- socket 实现服务器之间的通信!

        本文链接:https://www.haomeiwen.com/subject/kkkswqtx.html