Twisted 是Python中有名的网络库,实现的reactor模式。http://twistedmatrix.com/trac/里面有很多小demo
这里实现简单的客户端与服务端,并且配套有发送,接收数据的代码。
启动服务端 main.py
from tcp import *
def main():
f = ServerFactory()
f.protocol = PyTCPServer
reactor.listenTCP( 10008, f )
reactor.run()
if __name__ == '__main__':
main()
PyTcpServer实现 tcp.py
提供:
(1)客户端连接到服务端的消息
(2)客户端退出的消息
(3)数据接收和发送
(4)对发送数据的序列化
(5)对接收数据的拆包与合并[package.py]
(6)数据包的流向控制[dispatch.py]
from twisted.internet.protocol import Protocol, Factory, ServerFactory
from twisted.internet import reactor
import re
import string
import time
from package import *
from dispatch import *
class PyTCPServer( Protocol ):
def __init__( self ):
self.p = PyPackager()
self.dp = PyDepackager()
self.disp = PyDispatcher()
def connectionMade( self ):
print "client login."
def connectionLost( self, reason ):
print "client quit."
def dataReceived( self, data ):
self.dp.push( data )
msgs = self.dp.depackage()
self.disp.dispatch( msgs )
def dataSend( self, msg ):
self.transport.write( msg )
print msg
数据流分发 dispatch.py
class PyDispatcher():
def __init__( self ):
pass
def dispatch( self, msgs ):
pass
拆包与封装 package.py
# -*- coding: utf-8 -*-
import struct
class PyPackager():
def __init__( self ):
self.id = "server"
def package( self, data ):
cmd = data["cmd"]
btype = data["type"]
msg = data["data"]
size = len( msg )
fmt = "8siii%ds" % size
b = struct.pack( fmt, self.id, cmd, btype, size, msg )
return b
class PyDepackager():
def __init__( self ):
self.m_d = ""
self.m_buf = ""
def push( self, b ):
self.m_d = b
def depackage( self ):
ls = []
index = 0
while( True ):
buff = ""
if len( self.m_buf ) == 0:
buff = self.m_d
else:
buff = self.m_buf + self.m_d
size = struct.calcsize( "8siii" )
if len( self.m_d ) < index + size:
self.m_buf = self.m_d[:index]
break
cid, cmd, ctype, length = struct.unpack( "8siii", buff[index:index + size] )
data = buff[index + size:index + size + length]
package = {}
package["cid"] = cid
package["cmd"] = cmd
package["type"] = ctype
package["data"] = data
index = index + size + length
ls.append( package )
print package
return ls
与package实现相对应的c代码是这样的:
struct package
{
int cmd;
int type;
int length;
char d[1024];
int size(){sizeof(int)*3 + length;}
}
客户端另外在做介绍.