python - 无法弄清楚如何通过套接字发送 2D 数组 - OSError: [WinError 10022]
问题描述
我正在尝试通过套接字发送 2D 数组,它需要由多个 socket.recv() 组成,否则会_pickle.UnpicklingError: pickle data was truncated
出错。
我尝试使用接收数据包并将它们附加到列表中的 while 循环来执行此操作,直到收到所有数据:
def receive(self):
packets = []
while True:
packet = self.socket.recv(1024)
if not packet:
break
packets.append(packet)
data = b"".join(packets)
data = pickle.loads(data)
return data
只是在做:
def receive(self):
data = self.socket.recv(1024)
data = pickle.loads(data)
return data
如果我发送小于二维数组的东西,例如坐标对元组 (2, 3),则可以使用。但不是二维数组。
我OSError: [WinError 10022]
在尝试 while 循环方法时得到了一个。我已经看到 aOSError: [WinError 10022]
可能是不绑定套接字的问题,但我想我已经做到了。
我无法弄清楚连接在哪里关闭并且很困惑。
其余代码:
服务器:
import socket
from _thread import start_new_thread
clients = []
def threaded(client):
while True:
data = client.recv(1024)
if not data:
print('Not Data.')
break
# Send the data received from one client to all the other clients.
for c in clients:
if c != client:
c.send(data)
client.close()
def Main():
host = ""
port = 5555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Socket binded to port:", port)
s.listen(2)
print("Socket is listening.")
while True:
c, addr = s.accept()
clients.append(c)
print(f"Connected to: {addr[0]}:{addr[1]}")
start_new_thread(threaded, (c,))
s.close()
客户:
import socket
import pickle
class Client:
def __init__(self):
self.host = 'localhost'
self.port = 5555
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
def send(self, data):
message = pickle.dumps(data)
try:
self.socket.send(message)
except socket.error as e:
return str(e)
def receive(self):
packets = []
while True:
packet = self.socket.recv(1024)
if not packet:
break
packets.append(packet)
data = b"".join(packets)
data = pickle.loads(data)
return data
我要制作的客户端-服务器将有 2 个客户端,每个客户端都会不断地向另一个客户端发送数据。如何更正我的代码并正确实施?
解决方案
在做了更多的研究并弄清楚出了什么问题之后,我得到了解决方案。
代码从未退出这个 while 循环——因为数据不断被发送,并且总是有一些数据包传入。
def receive(self):
packets = []
while True:
packet = self.socket.recv(1024)
if not packet:
break
packets.append(packet)
我发现的一个解决方案是发送一条消息,指示接收到的消息应该有多大,这样我就可以知道特定消息的所有字节何时到达。链接:套接字 Python 3.5:套接字服务器在文件接收时永远挂起,Python 套接字接收大量数据
def send(self, data):
message = pickle.dumps(data)
msg_len = len(message)
try:
# Send what the total length of the message to be sent is in bytes.
self.socket.send(msg_len.to_bytes(4, 'big'))
self.socket.sendall(message)
except socket.error as e:
return str(e)
def receive(self):
remaining = int.from_bytes(self.socket.recv(4), 'big')
chunks = []
while remaining:
# until there are bytes left...
# fetch remaining bytes or 4096 (whatever smaller)
chunk = self.socket.recv(min(remaining, 4096))
remaining -= len(chunk)
# write to file
chunks.append(chunk)
chunks = b"".join(chunks)
data = pickle.loads(chunks)
return data
推荐阅读
- css - 当用户滚动到它时,如何让 div 粘在屏幕底部?
- python - 如何在 python 中执行多线程 selenium 程序?
- c - 使用 memset 初始化整数数组
- wordpress - 不同文件夹中多个 WordPress 安装的 htaccess 问题
- amazon-web-services - 无法让 HTTPS 与 S3 上的静态托管站点一起使用
- javascript - Webpack 导入代码拆分渲染
- xamarin.forms - Xamarin 在其中键入文本时在列表视图弹出窗口中形成带有建议项的条目
- qt - 在 Qt 对话框中让文本像终端一样滚动?
- r - dplyr::filter() 用于数据库
- java - Counting Valleys