免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3368 | 回复: 2
打印 上一主题 下一主题

【socket问题】socketserver的finish方法老是报错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-30 13:45 |只看该作者 |倒序浏览
本帖最后由 wfnh 于 2012-08-30 18:22 编辑

一段代码,finish老是报错,不知道是什么原因,很多情况我都试过了,还是没解决。

socket不是很熟悉,各位看看
服务端:
  1. #coding=gb2312
  2. #-------------------------------------------------------------------------------
  3. # Name:        模块1
  4. # Purpose:
  5. #
  6. # Author:      Administrator
  7. #
  8. # Created:     02/03/2012
  9. # Copyright:   (c) Administrator 2012
  10. # Licence:     <your licence>
  11. #-------------------------------------------------------------------------------
  12. #!/usr/bin/env python
  13. #import gevent
  14. import SocketServer
  15. import sys
  16. import MsgHelper
  17. import os
  18. class RequestHandler(SocketServer.StreamRequestHandler):
  19.     def handle(self):
  20.             """Read from StreamRequestHandler's provided rfile member,
  21.             which contains the input from the client. Mirror the text
  22.             and write it to the wfile member, which contains the output
  23.             to be sent to the client."""
  24.         l = True
  25.         while l:
  26.             l = self.rfile.readline().strip()
  27.             if l:
  28.                 self.wfile.write(l[::-1] + '\n')
  29.                 print "client say:",l + '\n'



  30. class RouteService(SocketServer.StreamRequestHandler):
  31.     allow_reuse_address = True
  32.     client_map = {}
  33.     msg_helper = MsgHelper.MsgHelper()
  34.     def handle(self):
  35.         ip_address = self.client_address[0]
  36.         print ip_address
  37.         print  '-' * 80
  38.         self.client_map[ip_address] = True
  39.         while True:
  40.             msg = self.rfile.readline().strip()
  41.             #print "befor:",msg
  42.             if msg:
  43.                 print "recv msg:",msg
  44.                 struct = self.msg_helper.unpack(msg)
  45.                 print 'parse msg:',type(struct),struct
  46.                 self.wfile.write(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
  47.                 #self.request.send(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
  48.                 #self.wfile.flush()
  49.                 print '*' * 50

  50.     def finish(self):
  51.         print "@call finish"
  52.         if not self.wfile.closed:
  53.             print "@call finish 0"
  54.             self.wfile.flush()
  55.         self.wfile.close()
  56.         print "@call finish 1"
  57.         self.rfile.close()
  58.         print "@call finish 2"
  59.         ip_address = self.client_address[0]
  60.         print "client down:",ip_address
  61.         self.client_map.pop(ip_address)
  62.         self.request.close()



  63. if __name__ == '__main__':
  64.     hostname = '127.0.0.1'
  65.     port = 1399
  66.     print "pid:",os.getpid()
  67.     server = SocketServer.ThreadingTCPServer((hostname, port), RouteService)
  68.     server.serve_forever()
复制代码
客户端的:
  1. #coding=gb2312
  2. #-------------------------------------------------------------------------------
  3. # Name:        模块1
  4. # Purpose:
  5. #
  6. # Author:      Administrator
  7. #
  8. # Created:     02/03/2012
  9. # Copyright:   (c) Administrator 2012
  10. # Licence:     <your licence>
  11. #-------------------------------------------------------------------------------
  12. #!/usr/bin/env python
  13. import socket
  14. import MsgHelper
  15. import os
  16. class MirrorClient:
  17.     def __init__(self, server, port):
  18.         #self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  19.         #self.wbufsize = 0
  20.         #self.rbufsize = -1
  21.         #self.wfile = self.socket.makefile('wb', self.wbufsize)
  22.         #self.rfile = self.socket.makefile('rb', self.rbufsize)
  23.         #self.socket.connect((server, port))
  24.         self.helper = MsgHelper.MsgHelper()
  25.         self.mail_box = MsgHelper.MailBox(server,port)

  26.     def mirror(self, s):
  27.         msg = {}
  28.         msg['do_check'] = s
  29.         ser = self.helper.pack(msg)
  30.         print "ser:",ser
  31.         self.mail_box.send(ser)
  32.       

  33.     def rece_msg(self):
  34.         msg = self.mail_box.recv()
  35.         print self.helper.unpack(msg)


  36.     def close(self):
  37.         self.mail_box.finish()

  38. if __name__ == '__main__':
  39.         hostname = '127.0.0.1'
  40.         port = 1399
  41.         print 'client pid:',os.getpid()
  42.         toMirror = 'weigun is good man'
  43.         m = MirrorClient(hostname, port)
  44.         for i in xrange(5):
  45.            print m.mirror(toMirror)
  46.         m.rece_msg()
  47.         m.close()
  48.         print "done"
复制代码
MsgHelper模块:
  1. #coding=gb2312
  2. #-------------------------------------------------------------------------------
  3. # Name:        模块1
  4. # Purpose:
  5. #
  6. # Author:      Administrator
  7. #
  8. # Created:     02/03/2012
  9. # Copyright:   (c) Administrator 2012
  10. # Licence:     <your licence>
  11. #-------------------------------------------------------------------------------
  12. #!/usr/bin/env python
  13. import msgpack
  14. import socket
  15. class MsgHelper():
  16.     def __init__(self):
  17.         self.packer = msgpack.Packer()
  18.         self.unpacker = msgpack.Unpacker()

  19.     def pack(self,struct):
  20.         '''
  21.         打包成二进制数据,返回二进制流
  22.         '''
  23.         return msgpack.packb(struct)
  24.         #return self.pack(struct)

  25.     def unpack(self,bin_stream):
  26.         return msgpack.unpackb(bin_stream)
  27.         #self.unpacker.feed(bin_stream)
  28.         #return self.unpacker.unpack()

  29. class MailBox():
  30.     def __init__(self,address,port,debug = False):
  31.         self.address = address or '127.0.0.1'
  32.         self.port = port or 1399
  33.         self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  34.         self.wbufsize = 0
  35.         self.rbufsize = -1
  36.         self.debug = debug
  37.         self.wfile = self.socket.makefile('wb', self.wbufsize)
  38.         self.rfile = self.socket.makefile('rb', self.rbufsize)
  39.         #--self.helper = MsgHelper()
  40.         self.socket.connect((address, port))

  41.     def __set_wbufsize(self,size):
  42.         self.wbufsize = size

  43.     def __set_rbufsize(self,size):
  44.         self.rbufsize = size

  45.     def send(self,msg):
  46.         if self.debug:
  47.             print msg
  48.         try:
  49.             self.wfile.write(msg)
  50.             self.wfile.write('\r\n')
  51.         except:
  52.             self.finish()
  53.             raise

  54.     def recv(self):
  55.         try:
  56.             recv_msg = self.rfile.readline().strip()
  57.             #--struct = self.helper.unpack(recv_msg)
  58.             if self.debug:
  59.                 print "recv msg:",recv_msg
  60.                 #--print "parse recv_msg:",type(struct),struct
  61.             return recv_msg
  62.         except:
  63.             self.finish()
  64.             raise


  65.     def finish(self):
  66.         if not self.wfile.closed:
  67.             self.wfile.flush()
  68.         self.wfile.close()
  69.         self.rfile.close()
  70.         self.socket.close()


  71. if __name__ == '__main__':
  72.     pass
复制代码
输出信息如下:
  1. pid: 8960
  2. 127.0.0.1
  3. --------------------------------------------------------------------------------

  4. recv msg: 仺do_check瞱eigun is good man
  5. parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
  6. **************************************************
  7. recv msg: 仺do_check瞱eigun is good man
  8. parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
  9. **************************************************
  10. recv msg: 仺do_check瞱eigun is good man
  11. parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
  12. **************************************************
  13. recv msg: 仺do_check瞱eigun is good man
  14. parse msg: <type 'dict'> {'do_check': 'weigun is good man'}
  15. @call finish
  16. @call finish 0
  17. @call finish 1
  18. @call finish 2
  19. client down: 127.0.0.1
  20. ----------------------------------------
  21. Exception happened during processing of request from ('127.0.0.1', 64388)
  22. Traceback (most recent call last):
  23.   File "C:\Python27\lib\SocketServer.py", line 582, in process_request_thread
  24.     self.finish_request(request, client_address)
  25.   File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
  26.     self.RequestHandlerClass(request, client_address, self)
  27.   File "C:\Python27\lib\SocketServer.py", line 639, in __init__
  28.     self.handle()
  29.   File "D:\test-area\getItem\gwsj\google svn\monitorService\routeService.py", li
  30. ne 50, in handle
  31.     self.request.send(self.msg_helper.pack({'respon':'ok'}) + '\r\n')
  32. error: [Errno 10053]
  33. ----------------------------------------
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-08-30 15:11 |只看该作者
回复 1# wfnh
报什么错?

   

论坛徽章:
0
3 [报告]
发表于 2012-08-30 18:22 |只看该作者
106033177 发表于 2012-08-30 15:11
回复 1# wfnh
报什么错?

报错是:
Exception happened during processing of request from ('127.0.0.1', 6438
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]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP