【问题标题】:Sending and Receiving arrays via Sockets通过 Socket 发送和接收数组
【发布时间】:2023-04-04 05:10:01
【问题描述】:

是否可以使用 Python 通过 UDP 套接字发送数组?我正在使用 Python 2.5 并尝试发送一个简单的数组,但它不起作用。它可以成功发送数组,但是当我尝试用数组的一个项目打印它时,程序崩溃了。我不确定错误是什么,因为我采取了将数据转换为数组的预防措施,但它不起作用。希望我尽可能清楚地解释了这个问题。我将不胜感激!

# Client program

from socket import *
import numpy
from array import*

# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

def_msg = "===Enter message to send to server===";
print "\n",def_msg
a = array('i',[1,3,2])
# Send messages
while (1):
    data = raw_input('yes or now')
    if data!= "yes":
        break
    else:
        if(UDPSock.sendto(a,addr)):
            print "Sending message"

# Close socket
UDPSock.close()



# Server program

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
    data,addr = UDPSock.recvfrom(buf)
    L = eval(data)
    if not data:
        print "Client has exited!"
        break
    else:
        print "\nReceived message '", L[1],"'"

# Close socket
UDPSock.close()

【问题讨论】:

    标签: python sockets udp


    【解决方案1】:

    如果您不需要 UDP,请尝试 zmqObjectExchanger (https://github.com/ZdenekM/zmq_object_exchanger)。它包装了 pickle 和 zmq 以通过 TCP 传输 python 对象。

    【讨论】:

      【解决方案2】:

      问这个问题已经有一段时间了,但我认为值得分享jsonsocket library。它使通过套接字发送字符串、列表和字典变得非常容易。它可以有效地处理大量数据。而且您不需要进行任何手动序列化/反序列化。在后台,它在客户端将数据序列化为 JSON 字符串,并在服务器上反序列化。

      【讨论】:

      • 这是一个非常好的库。它为我节省了大量时间和精力!
      【解决方案3】:

      我个人会使用tostringfromstring,因为内置的序列化方法是many times faster 和pickle may not support NaN、Inf 和其他未定义的值。

      【讨论】:

      • pickle 发送 numpy 数组很糟糕,绝对糟糕。 Picke 依赖于平台,发送 numpy 数组的效率极低,并且 numpy 在模块中提供了非常好的序列化支持,例如 tostringfromstring 但这些是复制方法。我实施的最佳解决方案是使用 Cython。
      【解决方案4】:

      eval 所做的事情与你的想法完全不同。

      要通过网络发送数据,您需要将其序列化为字节数组,然后反序列化返回。在 Python 中,大多数对象的序列化可以通过pickle 模块完成:

      if (UDPSock.sendto( pickle.dumps(a), addr)):
      

      反序列化:

      data,addr = UDPSock.recvfrom(buf)
      L = pickle.loads(data)
      print repr(L) # prints array('i', [1, 3, 2])
      

      【讨论】:

        【解决方案5】:

        你试图通过套接字发送一个python对象,它不起作用是正常的,你不能在套接字中发送对象,对象不是数据,它们是一些数据在一个给定的编程语言。您需要将您的对象“翻译”为数据,并从另一端的数据重新创建对象。一种方法是使用pickle 模块。

        在客户端,您“腌制”对象:

        data = pickle.dumps(my_array)
        

        在服务器端,你“解压”接收到的数据:

        my_array = pickle.loads(received_data)
        

        【讨论】:

          【解决方案6】:

          您可以尝试pickle 数组。 Pickle 是一个 Python 库,用于对 Python 对象进行编码和解码。它可以做更多事情,但绝对足以完成您的任务:

          在发送方你pickle对象到一个字符串:

          pickled_string = pickle.dumps(a)
          

          在接收方你unpickle对象:

          a = pickle.loads(received_string)
          # a is now your sent array
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-13
            • 2012-03-02
            • 2018-03-31
            • 2020-06-23
            • 1970-01-01
            • 2014-10-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多