- 浏览: 307096 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (69)
- python (31)
- android (1)
- 软件安装 (3)
- 运维监控 (5)
- pycurl (1)
- RFC (0)
- RFC,IRC,翻译 (1)
- ubuntu 打开 22端口 (1)
- redis (3)
- 缓存 (1)
- 多进程,共享数据,通信, (1)
- django (4)
- cookie (1)
- session (1)
- nodejs npm (1)
- mongodb (2)
- tornado (2)
- 异步 (1)
- seo (0)
- seo,错误,笔记 (1)
- sysv-rc-conf (1)
- ubuntu (2)
- 开机启动 (1)
- supervisor (1)
- 进程 (1)
- twitter tweepy (1)
- Bootstrap (1)
- Bootstrap-maxlength (1)
- 微信 (1)
- 公共号 (1)
- 框架 (1)
- mac,virtualbox,xp (1)
- beef (1)
- ruby1.8 (1)
- ruby1.9 (1)
- rvm (1)
- subline (1)
- egret (1)
- ssl (1)
最新评论
-
koreyoshi:
那要是周排名月排名呢
redis set轻松做排行榜应用 -
xuddk727:
仁兄能否将affinity_0.1.0发我一份?在我这该网站无 ...
python 绑定进程在某个cpu上执行-affinity -
mimicom:
wifi 调试 adb shell 的话 是 transpor ...
android adb shell 笔记 -
郭玉成:
一定要有SGMLParser.__init__(self) ...
用python解析html--SGMLParser -
jakejone:
支持一下,我刚开始学python,感觉不错,就是文档太少了。
python开发环境Eclipse+pydev字体和颜色设置方法(另附pydev安装方法)
#Email/gtalk:zealzpc@gmail.com
这是pyamf安装包里的例子,总的来说用pyamf来写server的各种例子还是很全的,包括django,gae,twisted,web2py等等,基本python常用的网络框架都有。现在很多网页游戏都是前端flash,那么和server端通信基本就用 amf了,如果server端的功能只是存储一些统计,或者对数据库的增删改查,那么一般的http短连接服务就能搞定了,以上提到的这些框架也都写起来比较简单,比如可以看django的例子http://www.pyamf.org/tutorials/gateways/django.html,寥寥数行就搞定了,python嘛。
但有时候需求不是这样的需要flash和server保持一个长连接来不断的进行通信改怎么搞呢?此时在pyamf的网站上看到了sockey这一段,正是我们想要的。
先看下server端的代码:server.py
# Copyright (c) The PyAMF Project. # See LICENSE.txt for details. """ Example socket server using Twisted. @see: U{Documentation for this example<http://pyamf.org/tutorials/actionscript/socket.html>} @since: 0.1 """ try: import twisted except ImportError: print "This examples requires the Twisted framework. Download it from http://twistedmatrix.com" raise SystemExit from twisted.internet.protocol import Protocol, Factory from twisted.internet import reactor from datetime import datetime import pyamf class TimerProtocol(Protocol): interval = 1.0 # 客户端链接到server后,server往客户端发送时间的间隔 encoding = pyamf.AMF3 timeout = 20 #客户端链接到server后多少时间不操作就断开链接的timeout def __init__(self): self.started = False #设置编码器 self.encoder = pyamf.get_encoder(self.encoding)、 #设置server端将数据编码成amf后存放的缓存地址 self.stream = self.encoder.stream def connectionLost(self, reason): Protocol.connectionLost(self, reason) print "locst connection:",reason #客户端没断开一个链接,总连接数-1 self.factory.number_of_connections -= 1 print "number_of_connections:",self.factory.number_of_connections def connectionMade(self): #如果服务器连接数超过最大连接数,拒绝新链接建立 if self.factory.number_of_connections >= self.factory.max_connections: self.transport.write('Too many connections, try again later') self.transport.loseConnection() return #总连接数+1 self.factory.number_of_connections += 1 self.timeout_deferred = reactor.callLater(TimerProtocol.timeout, self.transport.loseConnection) def dataReceived(self, data): #去除server收到client数据两端的空格 data = data.strip() #如果收到的是'start'命令 if data == 'start': # start sending a date object that contains the current time if not self.started: self.start() elif data == 'stop': self.stop() #每次执行完客户端请求后重置timeout,重新开始计算无操作时间。 if self.timeout_deferred: self.timeout_deferred.cancel() self.timeout_deferred = reactor.callLater(TimerProtocol.timeout, self.transport.loseConnection) def start(self): self.started = True self.sendTime() def stop(self): self.started = False def sendTime(self): if self.started: #往缓存流里写入信息,用编码器进行amf编码 self.encoder.writeElement(datetime.now()) #返回给客户端编码后的信息 self.transport.write(self.stream.getvalue()) #重置缓存流 self.stream.truncate() #每隔self.interval的时间再发送一次amf信息 reactor.callLater(self.interval, self.sendTime) class TimerFactory(Factory): protocol = TimerProtocol #最大链接数 max_connections = 1000 def __init__(self): self.number_of_connections = 0 class SocketPolicyProtocol(Protocol): """ Serves strict policy file for Flash Player >= 9,0,124. @see: U{http://adobe.com/go/strict_policy_files} """ def connectionMade(self): self.buffer = '' def dataReceived(self, data): self.buffer += data if self.buffer.startswith('<policy-file-request/>'): self.transport.write(self.factory.getPolicyFile(self)) self.transport.loseConnection() class SocketPolicyFactory(Factory): protocol = SocketPolicyProtocol def __init__(self, policy_file): """ @param policy_file: Path to the policy file definition """ self.policy_file = policy_file def getPolicyFile(self, protocol): return open(self.policy_file, 'rt').read() #设置域名,端口。 host = 'localhost' appPort = 8000 policyPort = 843 policyFile = 'socket-policy.xml' if __name__ == '__main__': from optparse import OptionParser #设置server启动选项 parser = OptionParser() parser.add_option("--host", default=host, dest="host", help="host address [default: %default]") parser.add_option("-a", "--app-port", default=appPort, dest="app_port", help="Application port number [default: %default]") parser.add_option("-p", "--policy-port", default=policyPort, dest="policy_port", help="Socket policy port number [default: %default]") parser.add_option("-f", "--policy-file", default=policyFile, dest="policy_file", help="Location of socket policy file [default: %default]") (opt, args) = parser.parse_args() print "Running Socket AMF gateway on %s:%s" % (opt.host, opt.app_port) print "Running Policy file server on %s:%s" % (opt.host, opt.policy_port) reactor.listenTCP(int(opt.app_port), TimerFactory(), interface=opt.host) reactor.listenTCP(int(opt.policy_port), SocketPolicyFactory(opt.policy_file), interface=opt.host) reactor.run()
里面最主要干活的就是TimerProtocol这个类。
在例子中还提供了另外一个文件:time.tac。懂twisted的人应该就知道了,这是一份twistd脚本,可以直接通过twisted自带的twistd来执行。里面import了 server.py中已经写好的TimerFactory,然后定义了一个application类,这样就可以通过twistd命令来执行了,twistd是什么可以参考官方文档http://twistedmatrix.com/documents/current/core/howto/application.html 本文就不细说了。
debug模式启动server:twistd -noy timer.tac
daemo模式启动server:twistd -oy timer.tac
你也可以直接启动server.py文件:python server.py、
区别就是第二种直接后台运行了在linux,你看不到报错和调试信息,当然windows上不行。
# Copyright (c) The PyAMF Project. # See LICENSE for details. import sys, os sys.path.append(os.getcwd()) from twisted.application import internet, service from server import TimerFactory, SocketPolicyFactory from server import appPort, policyPort timer = TimerFactory() policy = SocketPolicyFactory('socket-policy.xml') # this is the important bit application = service.Application('pyamf-socket-example') timerService = internet.TCPServer(appPort, timer) socketPolicyService = internet.TCPServer(policyPort, policy) timerService.setServiceParent(application) socketPolicyService.setServiceParent(application)
最后就是找个客户端来连接测测,例子里也提供了一个写好的flash,你打开通一个目录下的index.html就可以看看效果了。
例子里也给你准备了python的客户端。
# Copyright (c) The PyAMF Project. # See LICENSE for details. """ Python client for socket example. @since: 0.5 """ import socket import pyamf from server import appPort, host class AmfSocketClient(object): def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def connect(self, host, port): print "Connecting to socket server on %s:%d" % (host, port) try: self.sock.connect((host, port)) print "Connected to server.\n" except socket.error, e: raise Exception("Can't connect: %s" % e[1]) def start(self): msg = '' # tell server we started listening print "send request: start" try: self.sock.send('start') except socket.error, e: raise Exception("Can't connect: %s" % e[1]) while len(msg) < 1024: # read from server amf = self.sock.recv(1024) if amf == '': print "Connection closed." msg = msg + amf for obj in pyamf.decode(amf): print obj return msg def stop(self): print "send request: stop" self.sock.send('stop') if __name__ == '__main__': from optparse import OptionParser parser = OptionParser() parser.add_option("-p", "--port", default=appPort, dest="port", help="port number [default: %default]") parser.add_option("--host", default=host, dest="host", help="host address [default: %default]") (options, args) = parser.parse_args() host = options.host port = int(options.port) client = AmfSocketClient() client.connect(host, port) try: client.start() except KeyboardInterrupt: client.stop()
原文地址:http://www.pyamf.org/tutorials/actionscript/socket.html
代码就在pyamf安装包的pyamf / doc / tutorials / examples / actionscript / socket这个目录里。
欢迎讨论。
发表评论
-
一句话反射shell
2014-12-28 16:13 2910通过一句话反射一个shell 首先你在自己的及其上起 ... -
微信公共平台框架-python(支持多账号)
2014-04-15 15:39 4114email:zealzpc@gmail.com 因 ... -
进程管理工具 supervisor
2013-03-14 12:01 1687经常在服务器上会启动很多程序,然后重启一下又要一个个重新启 ... -
tornado 问题小计
2013-01-29 12:47 14011 tornaod在ubuntu 的安装目录 /usr/ ... -
django1.4 问题记录
2013-01-28 13:59 9131 ImportError: Settings canno ... -
聊聊 tornado 的异步回调
2013-01-17 10:47 14039异步回调程序的原理和写法我不就不介绍了,因为我主要是来吐槽下 ... -
小谈django 的 cookie和session
2012-11-12 00:03 9977本文针对django1.4 周末小闲在家研究了下dja ... -
小记 django 1.4的变化
2012-11-06 23:23 1595最近因为公司游戏功能逐渐到了收尾阶段也算空下来点了,就索性想尝 ... -
使用redisco轻松将python内置数据类型存入redis内
2012-07-26 23:12 9658我在之前的 <python使 ... -
python使用redis 神器 ---redisco(一)
2012-07-07 22:42 28644很久没认真推荐过东西了,实在是人懒也没以前那么有心思去研究 ... -
redis set轻松做排行榜应用
2012-05-31 20:23 15534Author:pako email:zealzpc@gmai ... -
永久修改python默认的字符编码为utf-8
2011-08-19 14:06 17708这个修改说来简单,其实不同的系统,修改起来还真不一样。下面来罗 ... -
ubuntu 上安装pycurl
2011-07-12 11:20 3141我 是 在 8。04上 安装的装了 easy_installl ... -
使用Twisted Application 框架
2011-06-20 15:12 6859翻译by:pako email/gtalk:zealzpc@ ... -
twisted:调用deferredlist多线程并发执行任务然后收集结果
2011-06-09 10:54 4517最近想通过twisted实现多线程并发去执行一件耗时的事,然后 ... -
对twisted 中deferred异步的理解
2011-03-29 15:38 4629最近小试了下twisted,还是发现用起来挺方便的,加之本身就 ... -
twisted简单实现多线程,轮询,后台daemon运行
2011-03-29 11:25 3270from twisted.application impo ... -
《django web开发指南》在v1.2.4版本上的出入
2011-01-25 00:44 1523<Django web 开发指南>第145页 第七 ... -
django.utils._os 中 safe_join 函数 windows下总报ValueError异常
2011-01-20 17:20 1805最近无聊在家看看django ... -
python 绑定进程在某个cpu上执行-affinity
2010-05-05 18:39 10583因为最近在看multiprocessing 所以想看看多进程在 ...
相关推荐
本文主要聚焦于使用Twisted来创建TCP、SSL以及Unix socket服务器的协议层。 在Twisted中,协议(Protocol)是处理网络数据的核心组件,它负责解析接收到的数据并作出相应的响应。通常,自定义的协议类会继承自`...
了解了TCP Socket编程的基本概念和流程后,你可以根据需求创建复杂的网络服务,如文件传输、在线聊天应用等。在进行Socket编程时,还要注意错误处理、并发处理(多线程或多进程)以及网络延迟等问题。对于大型项目,...
在Python中,使用socket库可以轻松创建TCP客户端和服务器。 1. **TCP服务器**: - `server1.py` 是一个基本的TCP服务器示例。首先,它会调用`socket()`函数创建一个socket对象,然后通过`bind()`方法绑定一个IP...
### Python Twisted Server端例子详解 #### 一、引言 在Python的网络编程领域,Twisted是一个功能强大且灵活的事件驱动网络引擎。它支持多种协议(如TCP、UDP、SSL/TLS等),并且提供了丰富的API来构建复杂的网络...
### Python 如何通过 Twisted 搭建 Socket 服务 #### 一、Twisted 框架简介 Twisted 是一个用 Python 编写的事件驱动网络引擎,它为开发多种类型的互联网应用程序提供了一种灵活的方法。Twisted 提供了丰富的 API ...
8. **网络编程库**:在实际开发中,可能还会使用到如socket库(Python的标准库)、Twisted、asyncio等网络编程库,它们提供了更高级别的抽象,简化了TCP服务器的开发。 通过对以上知识点的学习和掌握,你将能够构建...
4. **TCP和UDP编程**:书中的例子会涵盖如何使用Twisted创建TCP服务器和客户端,以及如何处理无连接的UDP通信。这对于实现聊天应用、文件传输等网络服务非常有用。 5. **HTTP编程**:了解如何使用Twisted实现HTTP...
结合pymssql和Twisted,开发者可以创建异步的数据库访问服务,比如构建一个数据库查询服务,当接收到请求时,使用Twisted启动异步查询,同时处理其他请求,提高系统的并发能力。例如,可以创建一个使用Twisted的HTTP...
- 使用 `twisted.web.server.Site` 创建 Web 服务器。 - 通过 `twisted.web.resource.Resource` 实现 HTTP 请求处理逻辑。 - 支持 RESTful API 设计。 3. **实现SMTP、POP3 和 IMAP服务**: - 使用 `twisted....
2. **TCP服务**:可能会有一个简单的TCP服务器示例,展示如何使用Twisted来监听和处理客户端的TCP连接。这将涉及`twisted.internet.protocol`和`twisted.internet.endpoints`模块。 3. **UDP通信**:除了TCP,...
这个 "twisted_demo.zip" 文件包含了一个使用 Twisted 框架实现的客户端和服务器通信的示例,它有助于理解如何利用 Twisted 的核心特性进行长连接通讯。以下是对 Twisted 相关知识点的详细解释: 1. **Twisted 框架...
Twisted 是一个开源的 Python 网络编程框架,专为异步网络编程设计,广泛应用于网络服务、客户端、协议实现和并发处理。其核心设计围绕事件驱动模型,使得开发者可以编写高性能、高并发的网络应用。本教程将深入探讨...
使用`socket()`函数创建一个socket实例,指定协议族(AF_INET for IPv4,AF_INET6 for IPv6)和套接字类型(SOCK_STREAM for TCP)。 ```python import socket s = socket.socket(socket.AF_INET, socket.SOCK_...
本教程将详细解释如何使用Twisted框架搭建一个简单的TCP Socket服务。 首先,我们需要导入必要的模块。在服务端(`tsTservTW.py`),我们引入了`protocol`和`reactor`两个模块,它们分别是Twisted框架中处理网络...
Twisted提供了多种I/O服务,包括TCP、UDP、SSL/TLS、UNIX域套接字等。开发者可以通过简单的接口创建服务器和客户端,例如: ```python from twisted.internet import protocol, reactor class Echo(protocol....
**Python** 是 Twisted 构建的基础,因为 Twisted 是用 Python 编写的,所以使用它意味着你可以利用 Python 的强大语法和丰富的生态系统。Python 的动态性和面向对象特性使得编写复杂的网络程序变得简单且灵活。...
3. **服务组件**:Twisted提供了服务组件模型,允许开发者构建复杂的多层服务结构,这些服务可以独立启动和停止,并可以与其他服务协作。 4. **延迟调用与定时器**:Twisted支持延迟调用和定时器功能,可以安排任务...