在Python中通过UDP接收整数

时间:2019-01-29 00:18:48

标签: python udp

我正在通过UDP从外部程序(Max / MSP)接收数据。

数据很好地进入了Python。

字符串按预期进入。也就是说,如果我发送“ 89-90-10-10”,则会以我可以在Python中使用的字符串的形式出现。

但是,如果我发送一个整数,尽管使用了encode()方法,它也仍然是“ int。,i.����”。

我的代码出了什么问题?

import socket

UDP_IP_ADDRESS = "127.0.0.1"

UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))


while True:
    print (type(data))
    print (repr(data))
    print (data.decode("utf-8"))

如果我从其他程序通过udp发送“ 1”,则会在Python中收到以下输出:

b'int \ x00,i \ x00 \ x00 \ x00 \ x00 \ x00 \ x01'

int,i

1 个答案:

答案 0 :(得分:1)

问题在于UDP流正在接收字节,无论您发送字符串还是整数。因此程序可能会将整数打包成字节。

下面的代码是一个黑客,忽略了一些接收到的数据。
当您发送整数1并接收b'int \ x00,i \ x00 \ x00 \ x00 \ x00 \ x00 \ x01' “ int”告诉接收者这是一个整数。随后是9个字节,其中整数通常以1、2、4或8个字节发送。
使用后8个字节不会返回值1,但使用后四个字节会返回值,因此下面的代码将字节[-4:]切片为仅获取后四个。

可能有一些文档或开放源代码项目可以正确处理Max / MSP数据,所以我建议对此进行研究。

这是用于导入数据的结构导入的文档: https://docs.python.org/3/library/struct.html

import socket
import struct

UDP_IP_ADDRESS = "127.0.0.1"

UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))

while True:
    data, addr = serverSock.recvfrom(65536)
    if data.startswith(b'int'):
        # assumes 4 byte unsigned integer
        received = struct.unpack('!I', data[-4:])[0]
    else:
        received = data.decode('utf-8')
    print (repr(data))  # for debug purposes
    print (type(received), received)