[刺鸟原创文章,转载请注明出处]

在之前的准备工作中,我们已经建立了一个socket服务器,并且经过了简单的测试,得到的结论是python可以满足我们的需求,那么接下来,我们要解决的是身为webgame服务端必须的几个功能模块:

一、记录和维护所有客户机的状态
    更新:按照jinmin_lan同学的建议,这里直接用self.transport.sessionno即可,查twisted文档的时候我忽略了这个东西。因此无需按照我下面的方法来手动维护,好吧,我造了一次轮子……

为了实现这个功能,我们先回过头来分析下之前的服务端代码:
    1、每个客户端连接会有一个gameSocket对象被创建,然后触发connectionMade事件。
    2、客户端数据到达的时候触发dataReceived事件
    3、连接断开的时候触发connectionLost事件,然后对象被析构

根据通常的处理思路,我们需要为每个客户端建立一个编号,即传说中的sockid,然后维护一个client和sockid之间的双向字典,以便我们能够简单的互相反查。我决定维护2份数据,以空间换时间,新建一个sockMana类来实现该功能:

  1. # sockmana.py
  2. class SockMana:
  3. def __init__ (self):
  4. self.sockNum = 0 #记录当前的在线总数
  5. self.sockIndex = 1 #累加sockid
  6. self.client2id = {} #保存client->sockid字典
  7. self.id2client = {} #保存sockid->client字典
  8. def addClient(self,client):
  9. #增加一个客户端
  10. print '** add client **'
  11. self.sockNum = self.sockNum + 1
  12. self.client2id[client] = self.sockIndex
  13. self.id2client[self.sockIndex] = client
  14. self.sockIndex = self.sockIndex + 1
  15. print self.sockNum
  16. print self.client2id
  17. print self.id2client
  18. def delClient(self,client):
  19. #删除一个客户端
  20. print '** del client **'
  21. if client in self.client2id:
  22. self.sockNum = self.sockNum - 1
  23. _sockid = self.client2id[client]
  24. del self.client2id[client]
  25. del self.id2client[_sockid]
  26. print self.client2id
  27. print self.id2client
  28. def getSockid(self,client):
  29. #通过client获取sockid
  30. if client in self.client2id:
  31. return self.client2id[client]
  32. else:
  33. return None
  34. def getClient(self,sockid):
  35. #通过sockid获取client
  36. if sockid in self.id2client:
  37. return self.id2client[sockid]
  38. else:
  39. return None
  40. #初始化连接管理器
  41. sockMana = SockMana()

接下来在我们的socket服务端代码中import它,并增加调用事件,然后略修改dataReceived事件,当收到客户端数据的时候,我们向客户端返回它的sockid,完整的服务端代码调整为:

  1. import os
  2. if os.name!='nt':
  3. from twisted.internet import epollreactor
  4. epollreactor.install()
  5. else:
  6. from twisted.internet import iocpreactor
  7. iocpreactor.install()
  8. from twisted.internet.protocol import Factory,Protocol
  9. from twisted.internet import reactor
  10. from sockmana import sockMana
  11. class gameSocket(Protocol):
  12. #有新用户连接至服务器
  13. def connectionMade(self):
  14. sockMana.addClient(self)
  15. print 'New Client'
  16. #客户端断开连接
  17. def connectionLost(self,reason):
  18. sockMana.delClient(self)
  19. print 'Lost Client'
  20. #收到客户端发送数据
  21. def dataReceived(self, data):
  22. print 'Get data:' + str(data)
  23. #向该客户端发送数据
  24. self.transport.write('your sockid is:'+ str(sockMana.getSockid(self)))
  25. if __name__=='__main__':
  26. f = Factory()
  27. f.protocol = gameSocket
  28. reactor.listenTCP(5200,f)
  29. print 'server started...'
  30. reactor.run()

然后我们依然用telnet,来建立2个连接试试。
   

可以看到,每增加一个客户端,我们的sockMana类中就会分别增加2个 key->val的键值对,通过sockMana.getSockid方法即可获取客户端的sockid,这样我们就为每个客户端建立了一个唯一且可用于传递和储存的数值编号,在以后的逻辑处理中,这将作为客户端的唯一标识。

好了,我们断开其中一个客户端,看看我们的sockMana工作正常否?
    

Yes!和预料中的一样,一切工作正常。我们又向前迈进了小小的一步,下面,我们得研究研究服务端如何和客户端之间高效的传输数据了。

转载于:https://www.cnblogs.com/pylemon/archive/2011/09/06/2168954.html

[转]用python来开发webgame服务端(3)相关推荐

  1. 聚播微信多开客服系统二次开发SDK服务端接口

    聚播微信多开客服系统二次开发SDK服务端接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);bre ...

  2. python搭建客户端和服务端

    python搭建客户端和服务端 前言 一.客户端搭建 搭建过程整理 TCP客户端 2.x版本 3.x版本 UPD客户端 2.x版本 3.x版本 二.TCP服务端搭建 搭建过程整理 2.x版本 3.x版 ...

  3. C++后端开发程序员应该彻底搞懂的【libevent网络库】,libevent组件构成以及编程要领丨Linux服务器开发丨服务端编程

    90分钟搞懂libevent网络库 1. 服务端事件组成 2. libevent组件构成以及编程概要 3. memcached是如何使用libevent 视频讲解如下,点击观看: C++后端开发程序员 ...

  4. 聚播微信群控云控引擎二次开发SDK服务端对接接口

    聚播微信群控云控引擎二次开发SDK服务端对接接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);b ...

  5. 17 SSR:使用 React.js 开发 Serverless 服务端渲染应用

    今天我想和你聊一聊怎么用 Serverless 开发一个服务端渲染(SSR)应用. 对前端工程师来说,Serverless 最大的应用场景之一就是开发服务端渲染(SSR)应用.因为传统的服务端渲染应用 ...

  6. C++ 开发SOAP服务端和SOAP客户端

    C++ 开发SOAP服务端和SOAP客户端 作者:flyfish  2012-5-12 目的:利用gSOAP自带的Calc例子 仿写一个 网络中使用计算器 客户端通过http发送xml格式的数据请求, ...

  7. 使用KBEngine开发UE4服务端——开发详解

    使用KBEngine开发UE4服务端--开发详解 1. 简述 开始正式进入开发,网络上关于开发和修改文件的文章较少,这里会记录自己开发过程中需要更改的地方和一些流程. 2. 前期的配置说明 根据前文配 ...

  8. Python 主流棋牌游戏 服务端 框架分析 原创笔记

    经测试此产品运营稳定 包含数十款房卡子游戏.俱乐部(五级权限).比赛场 客户端采用Lua脚本开发 .后端Python 看过一些棋牌产品 很多产品基于此套棋牌框架开发而来 算市面上一个主流框架 但却没有 ...

  9. 【转】使用Apache CXF开发WebServices服务端

    原地址:http://cnjava.blog.51cto.com/1208887/335630 在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apach ...

  10. grpc(3):使用 golang 开发 grpc 服务端和client

    1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...

最新文章

  1. A monad tutorial for Clojure programmers (part 3)
  2. ABAP:FTP Using SAP Functions
  3. 1040 有几个PAT(PAT乙级 C++)
  4. android 之 TabHost
  5. linux验证db2安装成功_DB2(Linux 64位)安装教程
  6. 手机端页面自适应解决方案—rem布局进阶版
  7. 有些路,只能一个人走。
  8. Android Studio调用高德地图api
  9. 图解MySQL系列(2)-SQL实战研究InnoDB架构设计
  10. vscode取消斜体注释
  11. 剑桥A1-C2单词表-01
  12. arduino数字端口输出电压可驱动多大继电器呢_「白皮书」数字信号与脉冲序列调理...
  13. jdk8新特性之出现This inspection finds all usages of methods that have @since tag in their documentation.
  14. stata 求输出相关系数矩阵命令_一文读懂结果输出命令大全(上)
  15. 一文理解 JWT、JWS、JWE、JWA、JWK、JOSE
  16. security+真的没有那么难考,我的信息安全分享
  17. 计算机能够快速准确,计算机操作练习题
  18. 冬奥闭幕 不说再见 中国移动咪咕与王濛开启全新合作
  19. 2021全新Java多线程并发入门到精通,一篇就能学会
  20. 设计模式(二)23种设计模式

热门文章

  1. 17、Python特征工程,用相关系数法选择数据特征
  2. c语言求范围内最大素数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  3. win7修复计算机 正常启动不了怎么办,Win7系统无法正常启动怎么办
  4. Eclipse将控制台输出信息保存为文件
  5. 应届毕业生的户口、档案、三方协议、报到证、见习期、工龄计算、转正定级等重要知识普及!
  6. Qt实现图片的简单压缩
  7. java三角形角度_利用java解决三角形角度问题
  8. 使用 ASP.NET 制作一个音乐网站
  9. 用计算机算术表白,数学表白密码
  10. Oracle XDB 组件 重建 说明