- 论坛徽章:
- 0
|
本帖最后由 wfnh 于 2012-08-30 18:22 编辑
一段代码,finish老是报错,不知道是什么原因,很多情况我都试过了,还是没解决。
socket不是很熟悉,各位看看
服务端:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- #import gevent
- import SocketServer
- import sys
- import MsgHelper
- import os
- class RequestHandler(SocketServer.StreamRequestHandler):
- def handle(self):
- """Read from StreamRequestHandler's provided rfile member,
- which contains the input from the client. Mirror the text
- and write it to the wfile member, which contains the output
- to be sent to the client."""
- l = True
- while l:
- l = self.rfile.readline().strip()
- if l:
- self.wfile.write(l[::-1] + '\n')
- print "client say:",l + '\n'
- class RouteService(SocketServer.StreamRequestHandler):
- allow_reuse_address = True
- client_map = {}
- msg_helper = MsgHelper.MsgHelper()
- def handle(self):
- ip_address = self.client_address[0]
- print ip_address
- print '-' * 80
- self.client_map[ip_address] = True
- while True:
- msg = self.rfile.readline().strip()
- #print "befor:",msg
- if msg:
- print "recv msg:",msg
- struct = self.msg_helper.unpack(msg)
- print 'parse msg:',type(struct),struct
- self.wfile.write(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
- #self.request.send(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
- #self.wfile.flush()
- print '*' * 50
- def finish(self):
- print "@call finish"
- if not self.wfile.closed:
- print "@call finish 0"
- self.wfile.flush()
- self.wfile.close()
- print "@call finish 1"
- self.rfile.close()
- print "@call finish 2"
- ip_address = self.client_address[0]
- print "client down:",ip_address
- self.client_map.pop(ip_address)
- self.request.close()
- if __name__ == '__main__':
- hostname = '127.0.0.1'
- port = 1399
- print "pid:",os.getpid()
- server = SocketServer.ThreadingTCPServer((hostname, port), RouteService)
- server.serve_forever()
复制代码 客户端的:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import socket
- import MsgHelper
- import os
- class MirrorClient:
- def __init__(self, server, port):
- #self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- #self.wbufsize = 0
- #self.rbufsize = -1
- #self.wfile = self.socket.makefile('wb', self.wbufsize)
- #self.rfile = self.socket.makefile('rb', self.rbufsize)
- #self.socket.connect((server, port))
- self.helper = MsgHelper.MsgHelper()
- self.mail_box = MsgHelper.MailBox(server,port)
- def mirror(self, s):
- msg = {}
- msg['do_check'] = s
- ser = self.helper.pack(msg)
- print "ser:",ser
- self.mail_box.send(ser)
-
- def rece_msg(self):
- msg = self.mail_box.recv()
- print self.helper.unpack(msg)
- def close(self):
- self.mail_box.finish()
- if __name__ == '__main__':
- hostname = '127.0.0.1'
- port = 1399
- print 'client pid:',os.getpid()
- toMirror = 'weigun is good man'
- m = MirrorClient(hostname, port)
- for i in xrange(5):
- print m.mirror(toMirror)
- m.rece_msg()
- m.close()
- print "done"
复制代码 MsgHelper模块:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import msgpack
- import socket
- class MsgHelper():
- def __init__(self):
- self.packer = msgpack.Packer()
- self.unpacker = msgpack.Unpacker()
- def pack(self,struct):
- '''
- 打包成二进制数据,返回二进制流
- '''
- return msgpack.packb(struct)
- #return self.pack(struct)
- def unpack(self,bin_stream):
- return msgpack.unpackb(bin_stream)
- #self.unpacker.feed(bin_stream)
- #return self.unpacker.unpack()
- class MailBox():
- def __init__(self,address,port,debug = False):
- self.address = address or '127.0.0.1'
- self.port = port or 1399
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.wbufsize = 0
- self.rbufsize = -1
- self.debug = debug
- self.wfile = self.socket.makefile('wb', self.wbufsize)
- self.rfile = self.socket.makefile('rb', self.rbufsize)
- #--self.helper = MsgHelper()
- self.socket.connect((address, port))
- def __set_wbufsize(self,size):
- self.wbufsize = size
- def __set_rbufsize(self,size):
- self.rbufsize = size
- def send(self,msg):
- if self.debug:
- print msg
- try:
- self.wfile.write(msg)
- self.wfile.write('\r\n')
- except:
- self.finish()
- raise
- def recv(self):
- try:
- recv_msg = self.rfile.readline().strip()
- #--struct = self.helper.unpack(recv_msg)
- if self.debug:
- print "recv msg:",recv_msg
- #--print "parse recv_msg:",type(struct),struct
- return recv_msg
- except:
- self.finish()
- raise
- def finish(self):
- if not self.wfile.closed:
- self.wfile.flush()
- self.wfile.close()
- self.rfile.close()
- self.socket.close()
- if __name__ == '__main__':
- pass
复制代码 输出信息如下:- pid: 8960
- 127.0.0.1
- --------------------------------------------------------------------------------
- recv msg: 仺do_check瞱eigun is good man
- parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
- **************************************************
- recv msg: 仺do_check瞱eigun is good man
- parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
- **************************************************
- recv msg: 仺do_check瞱eigun is good man
- parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
- **************************************************
- recv msg: 仺do_check瞱eigun is good man
- parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
- @call finish
- @call finish 0
- @call finish 1
- @call finish 2
- client down: 127.0.0.1
- ----------------------------------------
- Exception happened during processing of request from ('127.0.0.1', 64388)
- Traceback (most recent call last):
- File "C:\Python27\lib\SocketServer.py", line 582, in process_request_thread
- self.finish_request(request, client_address)
- File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
- self.RequestHandlerClass(request, client_address, self)
- File "C:\Python27\lib\SocketServer.py", line 639, in __init__
- self.handle()
- File "D:\test-area\getItem\gwsj\google svn\monitorService\routeService.py", li
- ne 50, in handle
- self.request.send(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
- error: [Errno 10053]
- ----------------------------------------
复制代码 |
|