如何通过python3套接字发送任何数据?

时间:2020-01-13 17:52:12

标签: python python-3.x sockets

我是python套接字的新手,我想编写一个d3.text("data.csv").then(function(data) { var rows = d3.csvParseRows(data, d3.autoType); columnCount = rows[0].length; x.domain(data.map(function(d) { return ??; })); y.domain([0, d3.max(data, function(d) { return ??; })]); for (var col=0; col<columnCount; ++Col) { g.selectAll(.bar) .data(data) .enter().append("rect") .attr("class", "Bar"+col) .attr("x", function (d) { return x(??); }) .attr("y", function (d) { return y(??); }) .attr("height", function (d) { return height - y(??); }) } }); ,它将在套接字上存储任何类型的数据,但是存在一些问题。我是这样做的:

send(data: any)
    def send(self, data: any):
        if type(data) is not bytearray:
            b = bytearray()
            b.extend(map(ord, data))
            self.__s__.sendall(b) # s is the socket
        else:
            self.__s__.sendall(data)

但这给了我

    def recv(self, len_of_packet: int):
        buf = bytearray()
        while len(buf) < len_of_packet:
            buf = buf.append(self.__s__.recv(len_of_packet - len(buf)))
        return buf

我在 buf = buf.append(self.__s__.recv(len_of_packet - len(buf))) TypeError: 'bytes' object cannot be interpreted as an integer 中执行了此循环,因为TCP套接字只能发送部分数据,我也做了recv(),因为if type(data) is not bytearray:只需要字节,但是由于某种原因它不起作用。我尝试使用sendall(),但还有另一个错误。 那么,发送数据并在另一端接收所有数据的最Python方式是什么?特别是我想发送图片和文本。以及如何处理bytes()返回str()(我想成为字节)的事实?

通话示例:

recv()

在另一端:

image = open('image.jpg', 'rb').read()
con.send(image)

2 个答案:

答案 0 :(得分:1)

您误解了bytearray.append()的工作原理:

help(bytearray.append)

B.append(int) -> None

在B的末尾附加一个项目。

您要使用bytearray.extend():

help(bytearray.extend)

B.extend(iterable int) -> None

将迭代器或序列中的所有元素附加到B的末尾。

您的代码还有其他一些问题。例如。一旦关闭连接,TCP套接字的recv将返回一个空的字节数组。如果连接过早中断,则这种情况下将出现无限循环。

答案 1 :(得分:-1)

我可能通过制作如下函数来解决了这个问题:

def send(self, data: any):
    if type(data) is int:
        data = str(data)
    if type(data) is bytes or type(data) is bytearray:
        self.__s__.sendall(data)
    else:
        b = bytearray()
        b.extend(map(ord, data))
        self.__s__.sendall(b)

def recv(self, len_of_packet: int):
    data = bytearray()
    while len(data) < len_of_packet:
        packet = self.__s__.recv(len_of_packet - len(data))
        if not packet:
            return None
        data.extend(packet)
    return data

至少此代码解决了我的问题,因为我已经通过套接字成功发送了图片