2009-11-02 199 views
0

我有一個Java套接字服務器,正在等待某個端口的n字節。我想編寫一個Python客戶端,它只是將某些端口上的字節發送到Java服務器。Python套接字客戶端到Java套接字服務器

由於Python沒有原語,我不確定發送的確實是n字節。有什麼建議麼?

更多細節:

我有一個Java的DatagramSocket是發生在n字節:

DatagramPacket dp = new DatagramPacket(new byte[n], n); 

回答

1

somesocket.send需要一個字節的字符串參數s - 只是確保len(s) == n,你是發送精確的n字節。 「原始」與它有什麼關係?

將數據轉化爲字節串(反面)的任意束,看到在Python的標準庫中的struct模塊(用於簡單的類型,如漂浮的均勻陣列的具體,但頻繁的情況下,array模塊往往是更好)。

+0

所以說我想發送雙3.4。 Java雙打是64位,所以我需要將python 3.4編碼爲8個字節。我將如何做到這一點?我從來沒有真正推動python的周圍,所以這是相當混亂。 – 2009-11-02 06:08:54

+0

@elben,'struct.pack',參見http://docs.python.org/library/struct.html。 – 2009-11-02 16:37:32

1

如果使用一個數據報插座(例如在UDP協議通過IP),套接字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的問題。

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 

謝謝!

相關問題