WriteUTF仅在第二次工作

时间:2012-07-16 16:18:39

标签: java

我在使用简单的Java服务器,客户端应用程序时遇到了一些麻烦。 基本上这些主题都说明了这一点:当我在服务器端执行writeUTF时,它只会在第二次执行时发送。 举个例子:

服务器:

public class Server {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            ServerSocket server     = new ServerSocket(7777);
            Socket client           = server.accept();
            DataOutputStream out    = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
            DataInputStream in      = new DataInputStream(new BufferedInputStream(client.getInputStream()));
            while(true) {
                for(int i = 0; i < 100; i++) {
                    out.writeUTF("Test" + i);
                    out.flush();
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

客户:

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            Socket client           = new Socket("localhost", 7777);
            DataInputStream in      = new DataInputStream(new BufferedInputStream(client.getInputStream()));
            DataOutputStream out    = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

            while(in.readUTF() != null) {
                System.out.println(in.readUTF());
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

控制台中的输出如下所示:

测试1 TEST3 TEST5 TEST7 Test9 TEST11

导致此行为的原因是什么?

4 个答案:

答案 0 :(得分:4)

这是因为您丢弃了客户端上的数据。

当您检查while(in.readUTF() != null)时,您每次都会从流中读取一个条目,看它是否为非空。然后你丢弃这个值,并在循环中读取一个新值。 (除了丢失值,这有一个错误,即总数值为奇数,while条件将评估为true,但下一次调用readUTF()将在循环内返回null。)

要解决此问题,您应该读取变量的值,并在使用之前对其进行测试 - 如下所示:

String value;
while((value = in.readUTF()) != null) {
     System.out.println(value);
}

如果您不喜欢将赋值和无效性检查作为单个表达式,则可以在最初和每个循环结束时分配value = in.readUTF(),但我个人认为这更容易出错。

答案 1 :(得分:0)

此循环

        while(in.readUTF() != null) {
            System.out.println(in.readUTF());
        }

抛弃它读取的每一秒字符串。在测试文件结尾时读取一个字符串,丢弃它,然后读取另一个字符串并打印出来。

答案 2 :(得分:0)

您正在使用while循环评估中的数据:

  while(in.readUTF() != null) {
      System.out.println(in.readUTF());
  }

请改为尝试:

  String line;
  while( ((line = in.readUTF()) != null) {
      System.out.println(line);
  }

答案 3 :(得分:0)

如果您想要套接字为UTF-8

你只需要添加&#34; UTF-8&#34;在BufferedWriter和BufferedReader的contstructor

这是样本

this.basicReader =   this.Client.getInputStream();
this.basicWriter =   this.Client.getOutputStream();
this.Reader= new BufferedReader(new InputStreamReader(basicReader,"UTF-8"));
this.Writer= new BufferedWriter(new OutputStreamWriter(basicWriter,"UTF-8"));

如何发送数据

this.Writer.write("data"+"\r\n");
this.Writer.flush(); 

并且您的主要问题是当您的客户收到消息时,您的客户端没有回复消息

server to client
client to server
server to client
像这样,尝试一下。