2016-07-02 12 views
0

私はPythonサーバー(私の同僚から)とjavaを使って接続しようとしています。目的は(今のところ)json配列を送ることです。最初に長さを送ることから始めます。私はPythonに翻訳しようとしている同等のPythonクライアントで動作します。 ソケットを介してjSON配列の長さを送信する(Java to Python)

この

は(私は、関連するコマンドデをコピーした)私のJavaコードのpythonサーバが最初にこのような長さを読み込み

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
    long length = (long) arraytosend.length(); 
    out.print(length); 

    String arraytosend = new JSONArray(test2).toString(); 
    out.println(new JSONArray(test2).toString()); 

からの抜粋です:「51」の後

N_BYTES_MSG_LEN = 8 
    raw_len = connection.recv(N_BYTES_MSG_LEN) 
    # here it output 51 as raw_len 

    try: 
     msg_len = struct.unpack(MSG_LEN_TYPE, raw_len)[0] 
     print msg_len 
     logger.debug('announced message length: {}'.format(msg_len)) 

    except: 
     logger.warning('could not interpret message length') 
     return None 

    # read the incoming message 
    raw_data = connection.recv(msg_len) 

    if len(raw_data) < msg_len: 
     logger.info('lost connection') 
     return None 

すぐに接続が失われます。

(Iは、Javaに変換しようとしています)のpythonクライアントコードは、次のように動作します。

try: 
     raw_data = json.dumps(dict(data=data)) 
    except: 
     logger.warning('Failed to create a json representation of the data') 
     return False 

    # TODO: this could fail for *very* large objects 
    raw_len = struct.pack('Q', len(raw_data)) 


    try: 
     connection.sendall(raw_len) 
     connection.sendall(raw_data) 
    except Exception: 
     logger.warning('lost connection while sending data') 
     raise 
+0

バイト? – dorien

答えて

0

解決策が見つかりました。あなたは、Javaの使用を考慮する必要があります。あなたは、に、サーバー(のpython)コードを変更することでこれを行うことができます。

raw_len = struct.pack('!Q', len(raw_data)) 

そして、あなたは、その後でそれを送ることができます:私はそれは私がして長さを送信することとしなければならないかもしれないと思う

JSONObject request = new JSONObject(); 
    request.append("data", array); 
    byte[] outBytes = jsonObject.toString().getBytes("UTF-8"); 
    out.writeLong(outBytes.length); 
0

あなたの受信機は、長さが8バイト(N_BYTES_MSG_LEN)で表現されると仮定しています。しかし、長い文字列を送る。 PrintWriter.write(long)はPrintWriter.write(Long.valueof(long).toString)と同じです。例えば、長さが356の場合、「356」を送信します。長さを最初に埋めてください: "00000356"。

+0

私は長さからゼロを追加しましたが、pythonはそれをすべて間違って読んでいます:そして受け取った長さは3688782553318174768です。私が読んだところでは、struct.unpack( 'Q'、...)をjava 。 – dorien

+0

私はpythonを知らない。しかし、それはPythonは、文字列以外の何か完全に数字のバイナリ表現として8バイトを読み取るようだ。このような大きな数字に翻訳すると、私はPythonが逆の順序でバイトを解釈すると仮定します。 – Heri

+0

私は分かりません。 8文字の文字列を送信しているようですが、それは必ずしも8バイトではありませんか? – dorien

関連する問題