无法从套接字接收数据

时间:2016-11-08 17:29:32

标签: python sockets

我正在制作客户端 - 服务器程序,并且客户端部分存在问题。 问题在于无限接收数据。我已经在python解释器中测试了下面列出的这个特定类。我已成功(可能没有)连接到谷歌,但随后程序停止在data = self.socket.recv(1024)中的函数recvData()中

import ast
import re

page_source = '''
<script type="text/javascript">
  var ad_reply_url = "http://www2.mudah.my/ar/send/0?ca=3_s&id=49825097&l=0";
  var mcvl = "";
  var images = [
     'http://img.rnudah.com/images/13/133608119523265.jpg',
     'http://img.rnudah.com/images/13/135608116569903.jpg',
     'http://img.rnudah.com/images/13/137608113616541.jpg',
     'http://img.rnudah.com/images/13/139608119186498.jpg'
  ];
 var thumbnails = [
    'http://img.rnudah.com/thumbs/13/133608119523265.jpg',
    'http://img.rnudah.com/thumbs/13/135608116569903.jpg',
    'http://img.rnudah.com/thumbs/13/137608113616541.jpg',
    'http://img.rnudah.com/thumbs/13/139608119186498.jpg'
 ];</script>
'''

variables = re.findall('(?si)var(.*?);', page_source)

var_collection = {}
for var in variables:
    var = var.strip()
    var_key = var.split(' = ')[0]
    var_value = ast.literal_eval(var.split(' = ')[1])
    var_collection.update({var_key: var_value})

print(var_collection['images'])

关于评论部分: 我认为在Case实现中存在问题,所以只使用if-then语句。但事实并非如此。

1 个答案:

答案 0 :(得分:0)

您的问题是(int)x >> 1仅在服务器端关闭套接字并且已收到所有数据时才返回空字符串。您编写客户端的方式,它不知道已收到完整的消息并等待更多。您如何处理该问题在很大程度上取决于服务器使用的协议。

考虑一个Web服务器。它发送一个行分隔的头,包括一个self.socket.recv(1024)参数,告诉客户端它应该读取多少字节。客户端扫描换行符直到标头完成,然后使用该值执行content-length(如果大,它可以读取块),这样当最后一个字节进入时,recv不会阻塞。

即使这样,也要做出决定。客户端知道网页的大小,但可能希望将部分数据发送给调用者,以便它可以在收到所有数据之前开始绘制页面。当然,调用者需要知道发生了什么 - API本身有一个协议或一套规则。

您需要定义客户端如何知道消息是否完整以及消息传递给其调用者的确切内容。处理这个问题的一个好方法是让[zeromq](http://zeromq.org/等其他协议为你工作。一个简单的python客户端/服务器可以用xmlrpc实现。许多其他方式。

你说你正在实施一个客户端/服务器程序,然后你提到“连接谷歌”和telnet ......这些都是非常不同的东西,单个客户端策略不适用于所有这些。