我是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)
答案 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
至少此代码解决了我的问题,因为我已经通过套接字成功发送了图片