Python -- socket 实现服务器之间的通信
2019-04-12 09:34:07来源:博客园 阅读 ()
现在需要做一个分布式课程设计(简单小游戏),三个人小组合作完成。
我需要设计一个登录注册服务器,接收来自网关服务器(消息中间件)的用户登录注册消息请求,然后生成访问数据库服务器的消息,发送给数据库服务器,接收并处理其返回信息,发送登录注册结果给网关服务器。(很简单的功能)
我的想法是:登录注册服务器主线程一直运行,监控是否有来自网关服务器的连接请求。每当接收到一次连接请求时,开辟一个新的子线程,处理来自网关服务器的消息请求,并生成访问数据库的请求消息,发送给数据库服务器,随即接收返回的数据库操作信息,子线程处理后发送登录注册结果给网关服务器。
编程语言: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('服务器已启动,开始提供 【登录 注册】 服务...\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")
原文链接:https://www.cnblogs.com/chen9510/p/10692523.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:day01
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash