免费注册 查看新帖 |

Chinaunix

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

请问python里使用socket编程时的buf一般怎么实现的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-19 14:53 |只看该作者 |倒序浏览
我有在C++里使用socket的经验,但是卡在buf问题上了,简单地讲我需要的就是个典型的buf:
能够在socket.recv的时候把数据放进buf里,然后解析buf里的数据,把用过的数据丢弃掉,尽量减少memcpy/memmove和内存的重新申请……
目前解析收到的数据也很简单:扫描目前为止收到的数据,根据里面花括号对的配对情况来分辨JSON字典的边界,把每个最外层字典作为一个消息拿出去分派。
大家说说该看什么资料呢……谢谢……

论坛徽章:
0
2 [报告]
发表于 2010-07-20 07:15 |只看该作者
看标准库。。。

论坛徽章:
0
3 [报告]
发表于 2010-07-20 09:09 |只看该作者
恩我就是想问问buf方面要看标准库的哪个部分……recv()得到的似乎是个不可变的字符串

论坛徽章:
0
4 [报告]
发表于 2010-07-20 11:36 |只看该作者
回复 3# sjinny
用缓冲区我觉得可以这样。

  1. import  array
  2. import struct
  3. buf=array.array('c',struct.pack('1024s',1024*''))
  4. buf[0]='s'
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-07-20 13:54 |只看该作者
恩我也看到了,我刚刚试着写了一个这个:

  1. import array

  2. class Buffer :
  3.         def __init__( self, len ) :
  4.                 self.__array= array.array( 'c', '\0'*len )
  5.                 self.__databegin= 0
  6.                 self.__datalen= 0

  7.         def getFreespace( self, minlen ) :
  8.                 rightSpace= self.__getRightSpace()
  9.                 if rightSpace < minlen :
  10.                         totalSpace= self.__databegin + rightSpace
  11.                         if totalSpace < minlen :
  12.                                 dlen= minlen - totalSpace
  13.                                 self.__array.extend( '\0'*dlen )
  14.                         self.__array[ 0:self.__datalen ]= self.__array[ self.__databegin:self.__datalen+self.__databegin ]
  15.                 return buffer( self.__array, self.__databegin + self.__datalen, self.__getRightSpace() )

  16.         def pushDataLen( self, len ) :
  17.                 self.__datalen += len

  18.         def getDataSpace( self ) :
  19.                 return buffer( self.__array, self.__databegin, self.__datalen )

  20.         def popDataLen( self, len ) :
  21.                 len= min( len, self.__datalen )
  22.                 self.__databegin += len
  23.                 self.__datalen -= len
  24.                 if self.__datalen == 0 :
  25.                         self.__databegin= 0

  26.         def __getRightSpace( self ) :
  27.                 return len( self.__array ) - self.__databegin - self.__datalen

复制代码
但是发现……原来buffer竟然是只读的……
我知道socket.recv_into可以传入一个array,但是由于不能指定数据从哪个位置开始写入,所以我怀疑每次都是从头部开始,而如果这个array里还有之前的剩余数据,那么这些剩余数据就会被覆盖了……

论坛徽章:
0
6 [报告]
发表于 2010-07-20 17:49 |只看该作者
psock.rar (2.4 KB, 下载次数: 61)
基本搞定了buf……目前不够理想的地方就是在从socket recv数据时会多一次拷贝……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP