【问题标题】:how to send an array over a socket in python如何通过python中的套接字发送数组
【发布时间】:2014-08-16 20:55:34
【问题描述】:

我有一个([1,2,3,4,5,6],[1,2,3,4,5,6]) 这个数组。我必须通过 python 中的 STREAM/TCP 套接字发送它。然后我必须在接收端接收相同的数组。

【问题讨论】:

  • 找到某种将其编码为字节的方法。最好的方法可能取决于您的数据。您是否总是想发送小数字数组?
  • 作为旁注......它看起来像一个数组元组(列表),而不是一个实际的数组。另外....泡菜可能会很好地为您服务:docs.python.org/3.2/library/pickle.html?highlight=pickle#pickle
  • 实际上我想发送一个 5x5 矩阵,并包含浮点值。请给我最好的方法来实现它。如果可能的话,用代码。谢谢
  • Pickle 可以很好地为您服务,但请记住,解开外国泡菜是不安全的(即,如果您不能保证泡菜的来源,那么您可能应该使用其他一些序列化格式,例如 json)。
  • 抱歉,我们不会为您完成您的工作...告诉我们您尝试过哪些不起作用...

标签: python arrays sockets


【解决方案1】:

Sockets 是字节流,所以最好是编写你的协议(阅读this

这是一个没有协议的基本示例,您应该关心缓冲区 -> recv()。如果它太小,您的数据将被切断。这就是为什么你应该实现一个协议,如果你发送未知大小的数据。

客户:

import socket, pickle

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
arr = ([1,2,3,4,5,6],[1,2,3,4,5,6])
data_string = pickle.dumps(arr)
s.send(data_string)

data = s.recv(4096)
data_arr = pickle.loads(data)
s.close()
print 'Received', repr(data_arr)

服务器:

import socket

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(4096)
    if not data: break
    conn.send(data)
conn.close()

【讨论】:

  • 如何打印特定索引处的数组值?
  • @AnuragSingh 给出一个数据示例和您需要的结果。
【解决方案2】:

我使用 json 解决了这个问题(因为我听说泡菜不安全)

客户:

import json
...
arr1 = [1,2,3]
arr2 = [4,5,6]
someVar = 7
data = json.dumps({"a": arr1, "b": arr2, "c": someVar})
socket.send(data.encode())

服务器:

import json
...
data = socket.recv(1024)
data = json.loads(data.decode())
arr = data.get("a")
var = data.get("c")

这里我们使用data.get("a")反序列化json字符串,您可以将其解释为data.a

【讨论】:

    【解决方案3】:

    您可以在发送到套接字之前序列化对象并在接收端反序列化它。检查this

    【讨论】:

      【解决方案4】:

      我通过遍历数组中的每个项目,将其添加到单个字符串中解决了这个问题,但带有重要字符,例如希腊字母或其他一些不常见的字符,然后通过套接字发送该字符串,然后拆分收到的字符串返回到另一侧的数组中,并删除新数组中的所有“分隔符”项。

      例如,客户端

      for item in myArray:
              print("item: ", item)
              myArrayString= myArrayString+ str(item) + "Δ"
          print(myArrayString)
          myServer.send((myArrayString).encode())
      

      然后在服务器上:

      files = myconnection.recv(50000)
              files = files.decode()
              myArray = files.split('Δ')
      
              for myItem in myArray:
                  print(myItem)
              print("End Of Items in Array")
      

      希望这会有所帮助!随时询问您是否需要澄清任何事情! :)

      【讨论】:

        猜你喜欢
        • 2021-02-03
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2011-03-30
        • 1970-01-01
        • 2015-12-08
        相关资源
        最近更新 更多