Python套接字接收(客户端)

2024-10-05 13:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须通过套接字连接到api并发送/接收一些数据。 公司向我发送了一个php示例文件,其中包含从套接字读取数据的代码:

function readAnswer() {
        $size = fgets($this->socketPtr, 64);    

        $answer = "";           
        $readed = 0;

        while($readed < $size) {
            $part = fread($this->socketPtr, $size - $readed);   
            $readed += strlen($part);
            $answer .= $part;
        }
        return $answer;
    }

这对我有用。但在python中,我有时会遇到错误。 不是所有的插座都能接收到。 我的python尝试如下所示:

^{pr2}$

我以dict/array的形式接收数据。有时我只得到一个int(我想是msg length) 那么从socket读取数据的更好方法是什么呢。 啊,api发送数据的方式是正确的,我检查过了。只是这个小功能;(

在使用下面的代码(感谢falsetru)并添加readed=len(数据)之后,我遇到了另一个问题: 这是正在工作的php代码:

 function _parse_answer($answerData)
        {
            $result = array();
            $lines = explode("\n", $answerData);
            $data = explode("&", $lines[0]);
            foreach($data as $piece)
            {
                $keyval = explode("=", $piece, 2);
                $result[$keyval[0]] = $keyval[1];
            }
            for($i=1;$i<count($lines);$i++)
            {
                $result["csv"][]=$lines[$i];
            }
            return $result;
        }

这是我糟糕的python代码:

def parse_answer(self,data):
        #print "dd_demo_api: answer: (%s)" % (data)
        if data:
            result = {}
            lines = data.split("\n")
            index_list = 0
            if len(lines) == 1:
                index_list = 0
            else:
                index_list = 1
            pieces = lines[index_list].split("&")
            for x in pieces:
                keyval = x.split("=")
                result[keyval[0]] = keyval[1]
            iterlines = iter(lines)
            next(iterlines)
            next(iterlines)
            count = 1
            result["csv"] = {}
            for x in iterlines:
                result["csv"][count] = x.split(";")
            return result
        else:
            return 0

我想这里需要一些优化吗?二)


Tags: 代码answerapidatasizeindexreturnresult
1条回答
网友
1楼 · 发布于 2024-10-05 13:15:45

Python版本与PHP版本不做相同的事情。在

尝试以下代码:

def read_answer(self, sock):
    size = int(sock.recv(64).strip().rstrip('\0'))

    # Above is not exactly same as `fgets`.
    # If that causes an issue, use following instead.
    #
    # f = sock.makefile('r')
    # size = int(f.readline(64).rstrip('\0'))
    #
    # and replace `sock.recv(n)` with `f.read(n)` in the following loop.

    total_data = []
    readed = 0
    while readed < size:
        data = sock.recv(size - readed)
        if data:
            total_data.append(data)
            readed += len(data)
    return b''.join(total_data)

相关问题 更多 >

    热门问题