64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
#!/usr/bin/python
|
|
#coding:utf-8
|
|
|
|
import sys,os,socket
|
|
import tw,ws
|
|
|
|
client = []
|
|
|
|
class Server(tw.Protocol):
|
|
#有客户端接入
|
|
def connectionMade(self):
|
|
self.attr={} #主要保存客户端的连接类型
|
|
self.socketLeftString = '' #socket传输中需要粘包的数据
|
|
self.transport.getHandle().setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,32*1024)
|
|
client.append( self )
|
|
|
|
#有客户端断开
|
|
def connectionLost(self,reason):
|
|
if self in client:
|
|
client.remove(self)
|
|
|
|
print 'connectionLost'
|
|
|
|
#收到客户端发来数据
|
|
def dataReceived(self, msg):
|
|
#WS握手
|
|
if msg.lower().find('upgrade: websocket') != -1:
|
|
ws.shake(self,msg)
|
|
return
|
|
ws.parse_recv_data(self,msg,self._dataReceived)
|
|
|
|
#数据解压后,执行解包粘包操作
|
|
def _dataReceived (self,msg):
|
|
if msg=='ping':
|
|
self.send('pong')
|
|
|
|
elif msg.startswith('sendOther@_@'):
|
|
msg = msg.replace('sendOther@_@','')
|
|
|
|
for c in client:
|
|
if c == self:
|
|
continue
|
|
c.send( msg )
|
|
|
|
|
|
def send (self,msg,callback=None):
|
|
msg = str(msg)
|
|
msg = ws.send_data(self,msg)
|
|
return self.sendDo(msg,callback)
|
|
|
|
def sendDo(self,msg,callback=None):
|
|
if not self.transport.connected or msg is None:
|
|
return
|
|
msg = str(msg)
|
|
tw.reactor.callFromThread(self.transport.write,msg)
|
|
|
|
#启动服务器
|
|
if __name__=='__main__':
|
|
f = tw.Factory()
|
|
f.protocol = Server
|
|
tw.reactor.listenTCP(3000,f)
|
|
print 'starting 3000'
|
|
tw.reactor.run()
|