使用twisted实现Python服务器

本文介绍了如何使用Twisted这一Python网络库来实现服务器。通过示例代码,展示了如何启动服务端,包括客户端连接通知、客户端退出处理、数据收发、数据序列化与反序列化以及数据包的流向控制等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;}
}
客户端另外在做介绍.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值