flex与twisted通过socket通信

本文深入探讨了使用Twisted框架进行MMORPG游戏开发的技术细节,包括登录连接、游戏逻辑处理、玩家移动、聊天系统实现以及断开连接流程。详细介绍了服务器端与客户端交互的代码实现,并提供了解决跨域问题的方法。
  flex端代码 height="510" horizontalScrollPolicy="off" verticalScrollPolicy="off" applicationComplete="init();"> 0){ bMsg.writeUTFBytes(sMsg+''); bMsg.writeUTFBytes('\r\n'); oSocket.writeBytes(bMsg); oSocket.flush(); } } //发送聊天 public function sendChat(msg:String):void{ var tempMsg:String = '['+nickName+']: '+msg; fooCommand(tempMsg); input.text=''; Alert.show("aaa") } //登陆连接游戏 public function fooConnect():void{ var sIP:String = ip_text.text; var sPort:Number = Number(port_text.text); var sUser:String = user_text.text; var sCode:String = code_text.text; var sPlayer:String = user_name.text; if(!(sIP&&sPort)){ Alert.show('服务器地址和端口号必填!','Warning:'); }else{ text_c.text = 'Connecting......'; text_c.setVisible(true); //btn_connect.enabled = false; oSocket.connect(sIP,sPort); if(sUser) fooCommand('user '+sUser); if(sCode) fooCommand('pass '+sCode); if(sPlayer) fooCommand('player:'+sPlayer); nickName = user_name.text; } } //断开链接,退出游戏 public function fooDisConnect():void{ oSocket.close(); game.setVisible(false); login.setVisible(true); } //玩家移动自己 private function movePlayer():void { var x:int = mouseX-64; var y:int = mouseY-90; if(y255 && x height="260" layout="absolute" title="MMORPG DEMO" horizontalCenter="0" verticalCenter="-26" id="login" visible="true"> height="500" layout="absolute" title="[{nickName}] - MMORPG DEMO" horizontalCenter="0" id="game" visible="false" borderColor="#9B8F28" borderStyle="none" mouseDown="movePlayer();" verticalCenter="0"> height="110" id="msg" editable="false" color="#E0630F" borderColor="#735211" text="" borderStyle="inset" fontSize="12" fontFamily="Verdana" /> height="20" id="pos" alpha="1.0" color="#F05C03"/> twisted端代码 # -*- coding: UTF-8 -*- #Twisted MMORPG from twisted.internet.protocol import Factory from twisted.protocols.basic import LineOnlyReceiver from twisted.internet import reactor import random import string class Game(LineOnlyReceiver): def lineReceived(self, data): self.factory.sendAll("%s" % (data)) def getId(self): return str(self.transport.getPeer()) def connectionMade(self): print "New User Login:", self.getId() self.transport.write("\0") self.transport.write("欢迎来到MMO世界!\n") self.factory.addClient(self) def connectionLost(self, reason): self.factory.delClient(self) class GameFactory(Factory): protocol = Game def __init__(self): self.clients = [] self.player = [] self.msg = '' self.x = range(100, 700) self.y = range(100, 500) def getPlayerId(self): return len(self.player) def addClient(self, newclient): self.clients.append(newclient) def delClient(self, client): self.clients.remove(client) def sendAll(self, data): print data if data.find('') != -1: self.clients[0].transport.write('\0') else: arr = data.split(':') prefix = arr[0] content = arr[1] if prefix.find('player') != -1: newPlayer = [content, str(random.randrange(200, 600)), str(random.randrange(150, 350)), str(random.randrange(1, 5))] self.player.append(newPlayer) self.msg = ' 玩家 ' + content + ' 进入游戏!' #广播所有玩家的位置 temp = [] playerData = ':::' for pos in self.player: temp.append(string.join(pos, '---')) playerData = playerData + string.join(temp, '***') self.clients[0].transport.write('[系统]: ' + self.msg + '\n') self.clients[0].transport.write(playerData) elif prefix.find('pos') != -1: playerName, x, y = content.split('---') i = 0 for p in self.player: if p[i][0] == playerName: p[i][1] = x p[i][2] = y for proto in self.clients: proto.transport.write(data) else: self.msg = data for proto in self.clients: proto.transport.write(self.msg + '\n') reactor.listenTCP(8555, GameFactory()) reactor.run() 以上代码通过服务器端直接将 crossdomain的内容返回到flex中。 上一篇文章已经介绍过,flex会先请求843这个端口下是否会返回crossdomain的信息因此可以通过部署端口为843的服务在解决flex跨域(8043 安全沙箱的问题)的问题
  843端口的服务代码为: from twisted.internet import reactor from twisted.internet.protocol import Factory, Protocol class PolicySocketProtocol(Protocol): def dataReceived(self, data): self.transport.write("\0") class PolicyFactory(Factory): def __init__(self): self.protocol = PolicySocketProtocol; if __name__ == '__main__': reactor.listenTCP(843, PolicyFactory(), interface="127.0.0.1") reactor.run()
### 如何在 Windows 系统中安装 PythonQt Designer 并配置环境 #### 安装 PyQt6 和 Qt Designer 为了在 Windows 上使用 Qt Designer,可以通过 `pip` 命令安装最新的 PyQt6 模块。PyQt6 是一个用于创建图形用户界面 (GUI) 应用程序的工具包,并附带了 Qt Designer 工具。 运行以下命令可以完成 PyQt6 及其相关组件的安装: ```bash pip install pyqt6-tools ``` 此命令会自动下载并安装必要的依赖项,其中包括 Qt Designer[^1]。 #### 配置路径以便访问 Qt Designer 安装完成后,通常可以在以下目录找到 Qt Designer 文件(具体位置取决于 Python 解释器的位置): - **对于标准安装**:`C:\Users\<用户名>\AppData\Local\Programs\Python\<版本号>\Lib\site-packages\pyqt6_tools` - 或者通过脚本启动:`python -m pyqt6_designer`. 如果希望直接从文件资源管理器或桌面快捷方式打开 Qt Designer,则需将其可执行文件所在路径添加到系统的环境变量 PATH 中。操作方法如下: 1. 打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置。 2. 单击“环境变量”,在“系统变量”部分找到名为 “Path”的条目并编辑它。 3. 添加上述提到的设计工具所在的完整路径至列表末尾。 这样处理之后,在任意 CMD 终端窗口输入 designer.exe 就能调用该应用程序。 #### 测试安装成功与否 验证是否正确设置了所有内容的一个简单办法就是尝试加载设计模式本身或者利用 PyQT 创建一个小项目来看看能否正常渲染 UI 元素。下面给出一段简单的例子展示如何载入由设计师保存下来的 .ui 文件并通过 python 运行起来: ```python from PyQt6 import uic import sys from PyQt6.QtWidgets import QApplication, QMainWindow class MyUI(QMainWindow): def __init__(self): super(MyUI,self).__init__() # 加载 ui 文件 uic.loadUi('your_ui_file.ui', self) if __name__ == '__main__': app = QApplication(sys.argv) window = MyUI() window.show() try: sys.exit(app.exec()) except SystemExit: pass ``` 以上代码片段假设存在一个叫做 'your_ui_file.ui' 的文件位于当前工作目录下,它是之前通过 Qt Designer 构建出来的界面布局定义文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值