0

したがって、基本的なクライアント/サーバー接続をセットアップし、接続時にメッセージを相互に送信しようとしています。クライアントにサーバーからメッセージを受信させましたが、サーバーはクライアントメッセージを受信しません。クライアントから送信されたデータを読み取るための現在のコードは次のとおりです。

ServerThread.socket = new ServerSocket(5556);
Socket client = ServerThread.socket.accept();
DataInputStream in = new DataInputStream
    (
        new BufferedInputStream(client.getInputStream())
    );
String s = in.readUTF();
System.out.println("Client: " + s);

それを使用しても、「クライアント:」だけでなく、何も出力されません。

これが私のクライアント接続用のコードで、メッセージを送信します。注:この部分はVBで書きました:

client = New TcpClient()
client.Connect("myiphere", 5556)
Dim stream As NetworkStream = client.GetStream()
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Hello server")
stream.Write(sendBytes, 0, sendBytes.Length)

データが受信されない理由はありますか? または、なぜ遅れているのでしょうか?コードの Java 部分を try catch ブロックで囲みましたが、エラーは発生しません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

DataInputStream の UTF には、先頭に 0 と長さが追加されます。

私は VB をあまり使っていないので、他にエラーがあるかどうかはわかりませんが、次のことを試してください。

stream.Write(0, sendBytes.Length, sendBytes)

知らない言語のコードを提案するべきではありません。readUTF で読み取りたい場合は0、テキスト バイトを送信する前に、1 バイトと文字列の長さに等しいバイトを送信する必要があります。

編集:ただし、DataInputStreamをまったく使用したくない場合があります。バイナリ ストリームを格納するためのものです。テキストを受信して​​いる場合は、Java 側でこれを試してください。

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        client.getInputStream()
    )
);
String s = in.readLine();

テキストを送信しない場合は、同じように BufferedInputStream を作成し、そこからバイトを読み取ります。

于 2012-04-21T03:08:10.853 に答える
0

MaybeWeCouldStealAVan が指摘したように、readUTFあと何バイトのコンテンツがあるかを示す 2 バイトが必要です。詳細については、 http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#readUTF () を参照してください。

ただし、UTF-16 入力 (1 文字あたり 2 バイト) を想定しているため、使用しているソリューションInputStreamReaderは機能しませんInputStreamReaderが、VB クライアントは ascii を送信しています。可能であれば、VB クライアントが UTF-16 を送信するようにすることをお勧めします (その場合は、WeCouldStealAVan の Java コードを使用します)。それができない場合 (申し訳ありませんが、VB で許可されているエンコーディングはわかりません)、readUTF動作させるために必要な余分な 2 バイトを書き込んでください。

于 2012-04-21T03:56:00.033 に答える