2011-12-28 39 views
0

當使用Java打開和關閉多個連接到同一主機的多個 時,我遇到了一個非常奇怪的問題。使用Python和Java打開套接字時的差異

我想運行一個for週期來打開一個TCP套接字,發送一些數據,接收一個 響應並關閉連接。在該循環的第三次迭代之後,其 停止工作。打開並寫入套接字仍然有效,但不能讀取。

我首先假定這是我的遠程主機有問題,但我寫的小蟒蛇 腳本調試這一點,它工作正常,腳本容易執行我for 週期超過50次迭代,並始終遠程主機回覆爲 預計。

與Python的方式相比,當python打開和關閉套接字的方式有什麼不同嗎 ?我怎樣才能調試呢?

謝謝。

UPDATE:

這裏是我使用在這兩種情況下的代碼:使用

for i in range(0, 10): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.send(command) 
    data = s.recv(1024) 
    data = data[2:] 
    print 'Received', "--->%s<--" % data.decode() 

的Java

for (int i = 0; i < 10; i++) { 
     Socket socket = new Socket("localhost", 9998); 

     OutputStream bos = socket.getOutputStream(); 
     InputStream bis = socket.getInputStream(); 

     byte[] raw = "XX0000NC".getBytes(); 
     raw[0] = 0x0; 
     raw[1] = 0x6; 

     bos.write(raw); 
     bos.flush(); 

     byte[] buffer = new byte[1024]; 
     int readCount = bis.read(buffer); 

     System.out.println(new String(Arrays.copyOfRange(buffer, 2, readCount))); 

     socket.shutdownOutput(); 
     socket.shutdownInput(); 
     socket.close(); 
    } 
+0

Python和Java的非常直接地映射到底層套接字函數。 **請發佈您遇到問題的代碼**。 – phihag 2011-12-28 11:36:30

+0

嘗試在「關閉」之前執行「關閉」操作。這將更加TCP友好。 – rodrigo 2011-12-28 12:15:26

+0

@ rodrigo謝謝。儘管如此,這並沒有改變。 – simao 2011-12-28 12:29:29

回答

0

您還沒有呈現出command值:

的Python在Python代碼中。也許你正在發送不同的命令?

唯一的其他區別,我可以看到的是,在Python使用socket.send' while in java you use OutputStream.write`:

不同的行爲發生在沒有足夠的緩衝空間來寫的所有數據:

  • send只發送它可以發送的數據量而不阻塞並返回發送的字節數。如果沒有字節可以發送,則會阻止。
  • write阻塞直到所有的字節被髮送。

誠然,我覺得這是不可能的,因爲你發送一個非常短的命令

您可以輕鬆地測試這個事件改變你的Python代碼:

for i in range(0, 10): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    sent = s.send(command) 
    if sent != len(command): 
     print 'Some bytes not sent!!!\n' 
    data = s.recv(1024) 
    data = data[2:] 
    print 'Received', "--->%s<--" % data.decode()