2011-12-28 8 views
0

Javaを使用して同じホストに複数の 連続接続を開いたり閉じたりするときに本当に奇妙な問題が発生しています。PythonとJavaでソケットを開くときの相違

私はforサイクルを実行して、tcpソケットを開き、データを送信し、 応答を受信して​​接続を終了しようとしています。このサイクルの3回目の反復後、 は機能しなくなります。ソケットのオープンと書き込みは動作しますが、読み取りはできません。

は、私が最初にこれが私のリモートホストとの問題だったと仮定が、私はこれをデバッグするために小型のpythonに スクリプトを書いて、それが正常に動作し、スクリプトを簡単に50回の以上の反復と常にリモートホストのための私のfor サイクルを実行します と返信します。

とJavaとの比較では、Pythonがソケットを開いたり閉じたりする方法に違いはありますか?これをどのようにデバッグできますか?

ありがとうございました。

UPDATE:

は、ここで私は両方のケースで使用していたコードです:

のPython:

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

+0

'close'の前に' shutdown'を実行してみてください。それはもっとTCPに優しいでしょう。 – rodrigo

+0

@rodrigoありがとうございます。しかしそれは何も変わらなかった。 – simao

答えて

0

あなたは使用commandの値を示していません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()