使用readUTF的EOFException DataInputStream

时间:2016-02-07 10:22:35

标签: java datainputstream eofexception

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

这是ServerCode:

    @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文档中读取此异常将被抛出<>。 但是我怎么能避免这种情况呢?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

尽管这不是Alesso的问题,但这是EOFException发生的另一种方式:

您将输出流打开到文件,然后再将输入流打开到相同的文件,而无需先关闭输出流。