0

サーバーとクライアント間の単純な StreamSocket 通信を実現しようとしています。サーバーは Java で作成され、クライアントは C# で作成されます。

クライアントからサーバーにメッセージ (文字列) を送信することは正常に機能します。しかし、逆に困ったことがあります。

サーバーからクライアントに文字列を送信すると、すべてのメッセージがクライアントから出力されるようになります。

次のように、クライアント側で StreamSocket を初期化します。

public async void startConn()
{
   StreamSocket streamSocket = new StreamSocket();
   try
     {
       await streamSocket.ConnectAsync(new Windows.Networking.HostName(server), port.ToString());

       DataReader reader = new DataReader(streamSocket.InputStream);
       reader.InputStreamOptions = InputStreamOptions.Partial;
       reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
       var count = await reader.LoadAsync(256);

       while (true)
       {
         string text = reader.ReadString(count);           
         Debug.WriteLine("Message: " + text);
         count = await reader.LoadAsync(256);
       }  
     }catch (Exception e)
     {
       //TODO
     }
}

メッセージの長さであっても、クライアントがサーバーからすべての文字列を出力することを望みます。しかし、サーバーからクライアントにメッセージを送信すると、StreamSocket のオプションを に設定しても、すべての文字列がすぐには出力されませんPartial

例えば:

Server send:   Hello         Client: print out nothing
Server send:   Today         Client: print out "Hello"
Server send:   Hi            Client: print out nothing
Server send:   Bye           Client: print out "Hi"

LoadAsync()別のサイズ (256 ではない) との異なるバージョンを試しUnconsumedBufferLengthました。しかし、毎回同じ結果が得られます。誰が私に教えてくれますか、何が問題なのですか?

よろしくお願いします DJTrust

4

1 に答える 1

0

はい、問題はサーバー側でした。この側は本当に簡単なので、Javaコードが正しいとは信じられませんでした。私はクライアント側に集中しすぎていました。

私の間違いは次のとおりです。

...
while(!(in.readLine().equals("quit")))
{
   String str = in.readLine();
   out.println(str);
   out.flush();
}
...

多すぎましin.readLine()た。正しい方法は次のとおりです。

String str = "";
while(!(str.equals("quit")))
{
   str = in.readLine();
   out.println(str);
   out.flush();
}

私は自分自身を噛むことができました;)。ヒントをありがとう。

DJトラスト

于 2015-03-29T16:17:22.900 に答える