【问题标题】:EOFException DataInputStream using readUTFEOFException DataInputStream 使用 readUTF
【发布时间】:2016-02-07 10:22:34
【问题描述】:

我编写了一个侦听客户端的简单服务器,当客户端连接时,它会打开一个 Datainputstream,读取从客户端发送的所有数据(我的客户端写入 UTF 数据)。

这是服务器代码:

    @Override
public void run() {
    // TODO Auto-generated method stub  
    try {           
        ServerSocket ss = new ServerSocket(7000);
        while(true){
        System.out.println("Il Server sta cercando Connessioni");
        Socket s = ss.accept();
        System.out.println("Il Server ha accettato un Client");

        Thread t2 = new Thread(new Runnable(){
            public void run(){             
                   try {
                    while(true){
                    DataInputStream dis = new DataInputStream(s.getInputStream());
                    isAlreadyOpened = true;                     
                    System.out.println(dis.readUTF());
                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    isAlreadyOpened = false;
                }  
            }           
        });
        if(!isAlreadyOpened){
        t2.start();
        }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是非常基本的,我的客户端是一个在单击按钮时发送数据的 Andorid 应用程序:

 @Override
public void onClick(View v) {
    try {
        DataOutputStream out = new DataOutputStream(s.getOutputStream());
        out.writeUTF("Testiamo sto socket");
        out.flush();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

当客户端连接到服务器时,一切都很完美。但是当我只单击一次客户端按钮时,发送的数据会显示在我的服务器日志中,但在引发异常后立即显示。

Il Server sta cercando Connessioni
Il Server ha accettato un Client
Il Server sta cercando Connessioni
Testiamo sto socket
java.io.EOFException
   at java.io.DataInputStream.readUnsignedShort(Unknown Source)
   at java.io.DataInputStream.readUTF(Unknown Source)
   at java.io.DataInputStream.readUTF(Unknown Source)

从 Oracle 文档中读取该异常被抛出 。 但是我怎样才能避免这种情况呢?

【问题讨论】:

  • 您是否尝试过在 readuTF 之前添加 if 语句,例如 if(dis.readUTF() != null){do the stuff}
  • 是的,我试过了。但它不起作用..它抛出异常但是一旦数据它就不会打印。所以我觉得比以前更糟了..
  • while(true)... 语句效率不高,应避免使用。 EOFException 是文件结束异常。所以这意味着你做错了什么(可能阅读了不存在的东西)。
  • While(true) 设置为允许服务器永远监听数据。我认为没有其他方法可以这样做..问题是当客户端发送数据时服务器可以读取它..但是由于它在一个while循环中..第二次没有数据阅读所以它抛出异常。即使我需要每次都监听数据的服务器,这也是我想要避免的。
  • @xdevs23 你关于while (true) 语句无效的说法是100% 的废话。没有什么比这更有效了。

标签: java datainputstream eofexception


【解决方案1】:

您正在发送一个字符串,然后关闭连接。您正在尝试读取无限多的字符串。他们没有被发送。你得到的是预期 EOFException.

这里没有问题要解决。如果您需要通过同一连接发送更多字符串,请不要在发送后关闭它。

【讨论】:

  • 哦,谢谢你的回答..我没明白。我认为连接没有关闭,因为服务器端一切都很好。问题是客户端在刷新输出流后关闭了套接字。我只是删除了 dos.close() 并且一切正常.. 非常感谢
【解决方案2】:

虽然这不是 Alesso 的问题,但这里是 EOFException 可能发生的另一种方式:

您打开一个文件的输出流,然后打开同一个文件的输入流,而不先关闭输出流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多