关于String和WirteUTF InputStream

时间:2013-09-15 17:20:21

标签: java sockets

这是我的计划的一部分:

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);}}

此程序将消息发送给其他客户端。 只有守则的第二部分有效。我想知道为什么我不能直接使用dis.readUTF() 我想知道原因。

1 个答案:

答案 0 :(得分: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循环的每次迭代中读取输入流dis中的while个字符串(nclients中的客户端数量),而你的第二个片段在while循环的每次迭代中只从输入流中读取一个字符串。

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`
    }
}