1

我在使用简单的 Java 服务器、客户端应用程序时遇到了一些问题。基本上,主题说明了一切:当我在服务器端执行 writeUTF 时,它只会在每 2 次执行时发送一次。例如:

服务器:

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 测试3 测试5 测试7 测试9 测试11

是什么导致了这种行为?

4

4 回答 4

4

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

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

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

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

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

于 2012-07-16T16:20:22.243 回答
0

这个循环

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

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

于 2012-07-16T16:20:42.297 回答
0

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

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

试试这个:

  String line;
  while( ((line = in.readUTF()) != null) {
      System.out.println(line);
  }
于 2012-07-16T16:23:43.733 回答
0

如果您想要 UTF-8 格式的套接字

只需在 BufferedWriter 和 BufferedReader 的构造函数中添加“UTF-8”

这是样本

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

像这样,试试看。

于 2014-10-11T06:28:07.390 回答