2011-10-17 20 views
-1

ファイルをバイト配列として読み込み、ネットワーク経由でソケット接続経由で送信しようとしています ファイルから読み込んだ後に(値を送信する前に)ソケットからそれを受け取った後のバイトの値...そしてそれは異なっていました!それは間違った値で受信され、私は知らないなぜJavaのソケットストリームで間違ったバイト値を受け取る

サンプルバイト送信する前に: 21、 0、 52、サンプルバイト受け取った後: -8、 -1、 -4を、 -1

私はバイトをwrite(byte [] b)で送信しました。 OutputStreamクラス であり、read(byte [] b、int off、int len)を使用してバイトを受け取りました。 InputStreamクラスの

誰でも助けてくれますか?

+1

を試すことができます。あなたがソースコードを見た場合、誰かがすぐに認識できる間違いをしている可能性があります。 4バイト以上読んでみましたか?あなたが読んだものは、あなたが書いたものとは何の関係もないと思っています。それはまったく別のものですが、私はそれも何か分かりません。 –

+0

vooとedが言ったように、私たちはそれ以上に進む必要があります。できるだけ小さなテストプログラムを作成して問題を再現し、投稿してください。私はちょうど同じメソッドを使用してそれらのバイトを送受信するクイックテストプログラムを作った、そしてそれは完全に動作します。 – Kevin

+0

このネットワーク接続は、異なるオペレーティングシステム間で行われますか?これはエンディアンの問題かもしれませんか? –

答えて

0

バイトと文字を区別して扱うように注意してください。バイトが署名されています!

+0

私はこれを考えましたが、明らかに(唯一の)問題ではありません。まず、ゼロはゼロ、符号付きであるかどうかです。第二に、私はビットを書き出し、パターンは見られない(〜0 = -1を超えて)。 – Kevin

1

あなたはVOOは、情報不足に不満を表現している

ServerSocket ss = new ServerSocket(0); 
Socket c = new Socket("localhost", ss.getLocalPort()); 

byte[] bytes = {21, 0, 52, 0}; 
c.getOutputStream().write(bytes); 
c.close(); 

byte[] bytes2 = new byte[4]; 
Socket s = ss.accept(); 
ss.close(); 

new DataInputStream(s.getInputStream()).readFully(bytes2); 
System.out.println(Arrays.toString(bytes2)); 
s.close(); 

プリント

[21, 0, 52, 0] 
+0

興味深い! javadocを読むことなく、 'c = new Socket(...)'がそれに続く 's = ss.accept()'を待っているときにコードがデッドロックしてしまうと思います。私はそれがないと思う:-) –

+0

@アドリアンプロンクいいえ、それはすべて非同期です。 c.close()を含むすべてのクライアントコードをaccept()の前に移動すると、それでも動作します。 – EJP

+0

@EJPでは、 's.getInputStream()';)の前に 's = ss.accept();'をつけなければならないと思います。 –

関連する問題