0

あるクライアント クラスから別のサーバー クラスにデータを渡す際に問題が発生しました。クライアントがサーバーに送信する各情報を格納する変数を作成し、アドレスまたはパスワードのいずれかが正しくない場合にサービスを拒否する if ステートメントを使用します。

ただし、ユーザーがパスワードを入力したときに問題が発生しました。次にアドレス。データは最初のラウンドで自動的に渡されます。クライアントがパスワード データを送信する代わりに、サーバーのパスワード変数にデータを格納します。次に、クライアントがアドレスを送信し、アドレス変数にデータを格納します。両方を送信し、両方を 1 つの変数に格納するだけです。

表示したい:

Password received: unlo91\ (made up password)
Address received: localhost

代わりに私は得る:

Password received: unlo91\localhost (made up password)
Address received: null

「そうです。クライアントはパスワードを送信しました。それを PW 変数に保存します。OK、それはすでに使用されているため (または既に一度使用されているため)、今は PW 変数に保存しないでください。次の使用可能な変数に移動します (アドレス) 次を保存します。」

サーバ:

cliPass = fromClient.readLine(); 
System.out.println("Client entered... " + cliPass );
cliAd = fromClient.readLine(); 
System.out.println("Client entered... " + cliAd);

クライアント:

    System.out.println("Type password");
    myPass = fromUser.readLine();
    toServer.writeBytes(myPass);


    System.out.println("Type address");
    myAd = fromUser.readLine();
    toServer.writeBytes(myAd);
4

3 に答える 3

3

あなたは本当に正しい質問をしていません。あなたが抱えている問題は以前の見落としが原因であり、それを修正すれば、この問題をスキップできます。

を使用してクライアントで行を読み取るとfromUser.readLine();、Javadocs に記載されているように、受信した文字列の行区切りが削除されます。

public String readLine() が IOException をスローする

テキストを 1 行読みます。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。

戻り値: 行終了文字を含まない、行の内容を含む文字列、またはストリームの末尾に到達した場合は null

したがって、サーバーに送信する前に文字列に追加し直すと、次のようになります。

System.out.println("Type password");
myPass = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myPass);


System.out.println("Type address");
myAd = fromUser.readLine() + System.lineSeparator();
toServer.writeBytes(myAd);

サーバー コードは期待どおりに動作するはずです。これは、再び別の行としてカウントされるためです。

または、本当にそれを行いたい場合Map<String, String>は、変数の数が不明な場合を検討する必要があります。

于 2013-03-13T22:41:05.010 に答える
1

を使用しArrayList<String>ます。

ArrayListにはadd、コレクションの最後に新しい値を追加するメソッド、があります。完了したら、ArrayListに対してforまたはループを使用して、各値を一度に1つずつ追加できます。foreach

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

大量の文字列を格納する必要があるが、それらを名前に関連付ける必要がある場合は、が必要ですHashMap<String,String>

HashMapで実行できます。値を取得するには.add("username", "tom")、実行すると「tom」が返されます。.add("password", "hunter12").get("username")

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

于 2013-03-13T22:34:51.427 に答える
1

問題は、readline メソッドが改行なしで文字列を返すことです。

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29

サーバーで使うと改行がないので、行末まで待ち続けます。

クライアントでこれを試してください:

System.out.println("Type password");
myPass = fromUser.readLine();
toServer.writeBytes(myPass + "\n");


System.out.println("Type address");
myAd = fromUser.readLine();
toServer.writeBytes(myAd + "\n");
于 2013-03-13T22:40:47.897 に答える