我有一个Java套接字服务器,它希望从某个端口获得n
个字节。我想编写一个Python客户端,它只是将某些端口上的字节发送到Java服务器。
由于Python没有原语,我不确定发送完全n
个字节。有什么建议吗?
更多详情:
我有一个Java DatagramSocket,它接收n
个字节:
DatagramPacket dp = new DatagramPacket(new byte[n], n);
答案 0 :(得分:1)
somesocket.send
采用字节字符串参数s
- 只需确保len(s) == n
,将发送精确的n
字节。 “原始人”与它有什么关系?!
要将任意数据束转换为字节字符串(并返回),请参阅Python标准库中的struct模块(针对特殊但常见的简单类型的数组,例如浮点数,{{3模块通常更好。)
答案 1 :(得分:1)
如果您使用数据报套接字(例如,基于IP的UDP协议),Socket API保证如果您的n
小于最大有效负载大小,那么您的数据将用一个包发送。所以只需调用socket.send
即可。
通过流套接字发送数据的最简单方法是使用socket.sendall
方法,因为流send
并不保证所有数据都是实际发送的(并且您应该重复调用send
以传输您拥有的所有数据)。这是一个例子:
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 12345))
>>> data = 'your data of length n'
>>> s.sendall(data)
正如@Alex已经提到的,Python中没有与某种“原语”相关的内容。这只是Socket API的问题。
答案 2 :(得分:0)
感谢您的回答,我想出了我在寻找什么。我想要的是struct.unpack和struct.pack,允许我将python float 1.2345打包到C double的字符串表示中。
那是:
>>> struct.pack('d', 1.2345)
'\x8d\x97n\x12\x83\xc0\xf3?'
>>> struct.unpack('d', struct.pack('d', 1.2345))[0]
1.2344999999999999
谢谢!