0

これは私のプログラムの一部です:

boolean bConnected = flase;
DataInputStream dis;
DataOutputStream dos;
List<CLient> clients;
public void send(String str) {
try {
           dos.writeUTF(str);
}
        catch (IOException e) {
        e.printStackTrace();
        }
    }

-----------------------Part 1--------------------------------

while (bConnected=true) {
         System.out.println(dis.readUTF().toString());
         for (int i = 0; i < clients.size(); i++) {
               Client c = clients.get(i);
               c.send(dis.readUTF().toString());}}
------------------Part 2----------------------------------

while (bConnected) {
         String str = dis.readUTF();
         System.out.println(str);
         for (int i = 0; i < clients.size(); i++) {
               Client c = clients.get(i);
               c.send(str);}}

このプログラムは、メッセージを他のクライアントに送信するためのものです。コードの 2 番目の部分のみが機能します。dis.readUTF() を直接使用できない理由を知りたい理由を知りたい。

4

1 に答える 1

1

コード スニペット間の動作にはかなりの違いがあります。

while (bConnected == true) { /* Note the use of `=` instead of `==` in your question */

    System.out.println(dis.readUTF().toString());           // Reads from the input stream 

    for (int i = 0; i < clients.size(); i++) {

        Client c = clients.get(i);
        c.send(dis.readUTF().toString());                   // Reads from the input stream
    }
}

このスニペットは、外側のループの反復ごとn + 1に入力ストリームから文字列を読み取ります (クライアントの数は です)。一方、2 番目のスニペットは、ループの反復ごとに入力ストリームから文字列を 1 つだけ読み取ります。diswhilenclientswhile

while (bConnected) {

    String str = dis.readUTF();                   // Reads from `dis`
    System.out.println(str);

    for (int i = 0; i < clients.size(); i++) {

         Client c = clients.get(i);
         c.send(str);                             // uses data read above, doesn't touch `dis`
    }
}
于 2013-09-15T17:47:21.573 に答える