2017-11-02 8 views
0

処理:サーバーから別々に複数のメッセージを一度に読み取るようにクライアントを設定するにはどうすればよいですか?私は、処理中に基本的なネットワークシステムのセットアップに取り組んでいます

import processing.net.*; 
Server myServer; 
Client myClient; 

はしかし、私はセットアップ私のサーバーとクライアント側の通信に問題を抱えています。私のクライアントはすべての着信メッセージを文字列として解釈しています。問題は、複数のメッセージが同じフレーム内のサーバーから送信されると、プログラムが解釈できない単一の文字列に追加されることです。テストの後、私は単一のクライアントからサーバーへの複数のメッセージの送信に同じ処理が行われることを発見しました。

私のクライアントの読者は、次のようになります。問題はリーダー(文字列を組み合わせて)、または実際に私が使用していることを書き込みしている場合

今のよう
while (myClient.available() > 0) { 
    String dataIn = myClient.readString(); 

が、私にはわかりません()を1回のフレームで複数回(およびデータが1つの文字列として送信されている)繰り返します。

メッセージが何らかの理由で別々に送信されたり読まれたりする可能性があるのでしょうか?そうでない場合は、メッセージがすでに送信されているかどうかをテストする方法があります。送信するメッセージを追跡するキューを設定します。

答えて

0

さて、メッセージを送信したかどうかを確認するために、私はそれを行うのに役立つ機能は見当たらなかったので、私は考えていません。代わりに、私は先に行って、送信するメッセージのキューとして機能するようにserverQと呼ばれるサーバのための文字列のArrayListの作成:

ArrayList <String> serverQ = new ArrayList<String>(); 

私はまたに任意の入力文字列を置きます関数writeSQ(String)を追加しましたキュー:

void writeSQ(String s) { 
    serverQ.add(s); 
} 

次に、myServer.write(String)のすべての使用をwriteSQ(String s)に置き換えました。私ServerUpdate機能の終わりに、私は一度にすべてのクライアント、1つのフレームに次の文字列を送信し、キューを空になりセクションを追加しました:

// send data 
    if (serverQ.size() > 0) { 
     myServer.write(serverQ.get(0)); 
     serverQ.remove(0); 
    } 
    } 

しかし、何らかの理由で、メッセージはまだ配合しまいました、私はそれが送信されたメッセージ(各フレーム)の近さ(頻度)に起因すると推測しました。そこで私はブール値のserverSentを設定して、他のすべてのフレームに送信されたメッセージを交互に置き換えます。新しいコードは次のようになります。

// send data 
    if (serverQ.size() > 0) { 
    if (!serverSent) { 
     myServer.write(serverQ.get(0)); 
     serverQ.remove(0); 
     serverSent = true; 
    } else 
     serverSent = false; 
    } 

これは完全に機能し、メッセージはクライアントによって個別に解釈されました。私はクライアントに正確に同じサポートコードを追加しました(必要に応じてサーバーからクライアントに至るまですべてを変更します)。そして十分な量のテストの後で、この新しいサポートが両方向で正しく機能することを確認できます。

関連する問題