EOFException:使用readUTF的DataInputStream

3

我将编写一个简单的服务器,监听客户端连接。当客户端连接时,它会打开一个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();
    }

这是一份关于 IT 技术的翻译。我的客户开发了一个 Android 应用程序,该应用程序在按钮被点击时发送数据。这是非常基础的内容。请注意,HTML 标签需要保留。

 @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文档中了解到,此异常被抛出 <>。但是我该如何避免这种情况呢?


1
你尝试在readUTF之前加上if语句吗,像这样:if(dis.readUTF() != null){do the stuff} - Briesanji
是的,我已经尝试过了。但它不起作用... 它抛出异常,但数据也没有打印一次。所以我认为它比以前更糟糕了... - Alessio Trecani
while(true)...语句不够高效,应该避免使用。 EOFException表示已到达文件结尾异常。这意味着您正在做某些错误的操作(例如读取不存在的内容)。 - xdevs23
1
While(true) 被设置为让服务器永远监听数据。我认为没有其他替代方法。 问题是当客户端发送数据时,服务器可以读取它。但由于它在 while 循环内部,第二次没有数据可读,因此会抛出异常。即使我需要服务器始终监听数据,我也希望避免这种情况。 - Alessio Trecani
1
@xdevs23,你关于 while (true) 语句不高效的说法是完全无稽之谈。没有比这更高效的了。 - user207421
@Briesanji,那个方法不会返回null。请查看Javadoc。 - user207421
2个回答

9

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

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


3
谢谢您的回答,但我没有理解。我以为连接没有关闭是因为服务器端一切正常。问题是客户端在清空输出流后关闭了套接字。我只是删除了 dos.close(),然后一切正常了。非常感谢。 - Alessio Trecani

0

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

您打开一个文件的输出流,然后稍后打开该文件的输入流,而没有先关闭输出流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接