使用 readUTF 的 EOFException DataInputStream

EOFException DataInputStream using readUTF

我已经编写了一个简单的服务器来侦听客户端,当客户端连接时,它会打开一个 Datainputstream,读取从客户端发送的所有数据(我的客户端 wirte 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 文档中读取此异常被抛出 <>。 但是我怎样才能避免这种情况呢?

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

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

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

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