`

Twisted Protocol操作二进制数据

阅读更多

今天写了一个twisted例程,很顺利,twisted的确不错。但是在调试def dataReceived(self,data):的时候,突然想到,如果data参数需要传入二进制数据怎么办,于是google一下,无果。后来想了一下,会不会像php一样不管string和binary都当作字符串处理?毕竟都是弱类型。

 

于是,就写了两段代码,一个服务端,一个客户端。他们的工作是,客户端读取一个图片文件的数据,然后发送到服务器端,服务器端原样返回,然后客户端再把返回的数据存到另一个图片里面,看看,存入的图片对不对(由于没有写buffer,所以你要试验的话,尽量找个小图片,否则,可能会存下半张图片),结果不出我所料,和php一样string和binary不分的,就是客户端发送过去的是string服务端就当字符串处理,如果发过去的是binary就当binary处理(python有个struct模块 专门处理二进制数据,和php的pack、unpack是 函数一样的,连函数名都一样,不知道谁抄谁的)

 

下面是server端代码:

from twisted.internet import reactor, defer, protocol
from twisted.internet.protocol import Protocol

class DeferFactory(protocol.ServerFactory):
    def __init__(self):
        self.deferred = defer.Deferred();
        
class Piper(Protocol):
    def connectionMade(self):
        self.transport.write("An apple a day keeps the doctor away\r\n");
        #self.factory.deferred.callback(self);
    
    def dataReceived(self,data):
        self.transport.write(data);
        #self.factory.deferred.callback((self, data));

def testcallback(data):
    data[0].transport.write(data[1]);
    
    #factory.deferred.callback 
    #This can only be run once. 
    #Later calls to this or errback will raise twisted.internet.defer.AlreadyCalledError.
    #so redefine this
    data[0].factory.deferred=defer.Deferred();
    data[0].factory.deferred.addCallback(testcallback);

if __name__ == "__main__": 
    factory = DeferFactory();
    factory.protocol = Piper;
    factory.deferred.addCallback(testcallback);

    reactor.listenTCP(8007,factory);
    reactor.run();

 然后是client端:

# connectiontest.py
from twisted.internet import reactor, defer, protocol

class CallbackAndDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.deferred.callback("Connected!");
    
    def dataReceived(self,data):
        if(data.find("apple") > 0):
            myfile = file("C:\\fish.jpg", "rb");
            self.transport.write(myfile.read());
            myfile.close()
        else:
            myfile = open("C:\\fish2.jpg", "wb");
            myfile.write(data)
            myfile.close()
            self.transport.loseConnection()
            reactor.stop()

class ConnectionTestFactory(protocol.ClientFactory):
    protocol = CallbackAndDisconnectProtocol
    def __init__(self):
        self.deferred = defer.Deferred()
        
    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)
    
def testConnect(host, port):
    testFactory = ConnectionTestFactory()
    reactor.connectTCP(host, port, testFactory)
    return testFactory.deferred
    
def handleSuccess(result, port):
    print "Connected to port %i" % port
    #reactor.stop( )
    
def handleFailure(failure, port):
    print "Error connecting to port %i: %s" % (port, failure.getErrorMessage())
    reactor.stop()
    
if __name__ == "__main__":
    #import sys
    #if not len(sys.argv) == 3:
    #    print "Usage: connectiontest.py host port"
    #    sys.exit(1)
    #host = sys.argv[1]
    #port = int(sys.argv[2])
    #connecting = testConnect(host, port)
    #connecting.addCallback(handleSuccess, port)
    #connecting.addErrback(handleFailure, port)
    
    connecting = testConnect("localhost", 8007)
    connecting.addCallback(handleSuccess, 8007)
    connecting.addErrback(handleFailure, 8007)
    reactor.run( )
 

 

分享到:
评论

相关推荐

    python Twisted

    Whl(Wheel)是Python的二进制包格式,用于简化软件包的安装过程,它包含了编译后的Python模块和所有依赖项。例如,`Twisted-17.5.0-cp27-cp27m-win_amd64.whl`是针对Python 2.7和64位Windows系统的,`-cp27m`表示它...

    Twisted(适用python3.7)

    在Windows上,通常我们会使用pip(Python的包管理器)来安装第三方库,但由于Twisted可能没有预编译的二进制版本,因此可能会遇到安装困难。此时,提供了一个名为“Twisted-18.7.0-cp37-cp37m-win_64.whl”的文件,...

    Twisted-15.4.0

    这可能包括使用 Python 的 `setup.py` 脚本来编译和安装,或者通过 pip(Python 的包管理工具)安装预编译的二进制包。 在实际开发中,使用 Twisted 可以创建高性能的服务器应用,例如聊天服务器、游戏服务器或...

    Twisted-20.3.0-cp37-cp37m-win32.zip

    解压缩后,我们得到的是一个名为"Twisted-20.3.0-cp37-cp37m-win32.whl"的.whl文件,这是一种Python的二进制包格式,可以直接通过pip工具进行安装。 要安装这个whl文件,你需要确保已经安装了Python 3.7以及pip。...

    Twisted-20.3.0-cp37-cp37m-win32.whl

    `.whl`是Python的二进制包格式,用于简化安装过程。通过`pip`工具,可以直接安装`.whl`文件,避免了编译源码的过程。对于Windows 32位环境,用户只需在命令行输入`pip install Twisted-20.3.0-cp37-cp37m-win32.whl...

    数据专业试题带答案.doc

    数据专业试题涵盖了许多关键...19. **十进制转二进制**:十进制数224转换为二进制是11100000。 这些知识点涵盖了网络基础、IP通信、网络设备配置、操作系统管理和网络监控等多个方面,是数据专业人员必备的基础知识。

    数据专业试题(带答案).docx

    19. **十进制转二进制**:十进制数224的二进制表示是11100000。 20. **Softswitch的功能**:Softswitch可以处理媒体流的建立和释放,但并不直接处理IP包的转发,那是路由器的任务。 这些知识点涵盖了网络基础、...

    数据专业试题(带答案).doc

    19. **十进制与二进制转换**:十进制数224转换成二进制是11100000。 20. **Softswitch功能**:Softswitch主要处理媒体流的建立和释放,不直接参与IP包的转发或业务逻辑的建立。 21. **软交换功能**:软交换不提供...

    Python库 | autobahn-17.6.2.tar.gz

    开发者可以通过简单的API创建WebSocket连接,发送和接收文本或二进制数据。此外,它还支持WebSocket的子协议和扩展,如Per-Message Deflate压缩,提高了传输效率。 2. WAMP协议实现: Autobahn对WAMP的支持使得...

    计算机网络名词解释题,学校老师总结的,比较全面,拿出来分享

    3. FSK(Frequency Shift Keying):频移键控,一种数字调制技术,通过改变信号频率来表示二进制数据。 4. PPP(Point-to-Point Protocol):点对点协议,用于在两个直接连接的设备之间建立数据链路,常用于拨号...

    1计算机网络术语.doc

    7. **Bit (比特)**:比特是信息的基本单位,代表一个二进制位,可以是0或1。 8. **Bit Rate (比特率)**:比特率表示每秒钟传输的比特数量,衡量数据传输速率。 9. **Code Cell (码元)**:码元是时间轴上的信号编码...

    2014年重庆理工大学《计算机专业英语》期末考试试卷.pdf

    2. Binary Number System(二进制数系统):是计算机系统中最基本的数制,所有的信息在计算机内部均以二进制形式表示和处理。 3. Operating System(操作系统):是管理和控制计算机硬件与软件资源的程序,提供用户...

    PyNet

    IPv4是最常见的版本之一,采用32位的二进制数表示(例如192.168.1.1),而IPv6则使用128位的地址空间,为未来的网络设备提供了更多的地址资源。在互联网中,每一台主机都有一个全球唯一的IP地址,这样不同的网络间的...

    计算机网络课程作业-模拟题

    12. 网卡的MAC地址由48位二进制数组成,是物理网络接口的唯一标识。 13. 网络协议的三要素是语法、语义和同步,定义了数据传输的规则、意义和时序。 14. 文件传输协议FTP(File Transfer Protocol)属于应用层协议...

    2016-2017 学年华中科技大学《计算机网络》答案1

    - 双极性表示是将二进制序列转换为带有符号的表示,便于无线传输。 - 复用信号的解码过程涉及到各个站点的码序列与接收到的信号进行相关运算,从而识别每个站点发送的信息。 以上就是从题目中提取出的计算机网络...

    华南理工大学--计算机网络--期末试卷真题和答案.pdf

    - **IMAP**(Internet Message Access Protocol)则支持邮件的在线浏览和管理,邮件存储在服务器上,客户端可以进行邮件的检索、分类等操作。 #### 二层冗余问题及解决方案 - 在二层网络中使用冗余拓扑可以提高网络...

    华为面试试题

    例如,对于`192.168.19.255/20`,其二进制表示为: ``` 11000000.10101000.00010011.11111111 11111111.11111111.11110000.00000000 ``` 其中,“1”表示网络位,“0”表示主机位。前缀长度“20”指示了子网掩码中...

    如何实现点对点的聊天

    - JSON、XML或Protocol Buffers等格式将数据结构转换为可传输的二进制形式。 9. **用户界面**: - 设计友好的UI,包括输入框、发送按钮、消息展示区等。 - 实现文件传输、表情支持等功能。 10. **错误处理与重...

Global site tag (gtag.js) - Google Analytics