捕获dataInputStream.readUTF()的问题;

时间:2015-06-18 08:02:45

标签: java android sockets datainputstream

我正在制作一个Java程序,使我的计算机成为服务器,通过WiFi与我的智能手机进行通信。因此我使用Socket类,如下面的代码所示(基于Android-er):

package main;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerCommunication {

    @SuppressWarnings("resource")
    public static void main(String[] args){
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        String message = null;

        try {
            int portNumber = 8888;
            serverSocket = new ServerSocket(portNumber);
            System.out.println("Listening :" + Integer.toString(portNumber));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        while(true){
            try {
                clientSocket = serverSocket.accept();
                dataInputStream = new DataInputStream(clientSocket.getInputStream());
                dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
                System.out.println("ip: " + clientSocket.getInetAddress());
                System.out.println("message: " + dataInputStream.readUTF());
                dataOutputStream.writeUTF("test");

                message = dataInputStream.readUTF(); // <--- PROBLEM LINE

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally{
                if( clientSocket!= null){
                    try {
                        clientSocket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if( dataInputStream!= null){
                    try {
                        dataInputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                if( dataOutputStream!= null){
                    try {
                        dataOutputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

当问题行(用&lt; ---表示)在文件中不存在时,一切都很完美。我收到的信息已正确打印在控制台中。但是,在我希望将此消息存储在String中的那一刻,我得到了一个java.io.EOFException ......

任何人都可以告诉我为什么我可以打印邮件,但不能将其存储为字符串吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

异常java.io.EOFException表示读取流中的所有数据,看起来就像你试图两次使用数据一样,在下面的语句中有一个,

System.out.println("message: " + dataInputStream.readUTF());

和下一个,

dataInputStream.readUTF()

从写入端(客户端)写入更多数据或使用一次。希望它有所帮助。

答案 1 :(得分:0)

致电后

mockService.Setup<IEnumerable<SchoolyearDTO>>(c => c.GetSchoolyears()).Returns(
                    Task.FromResult(Enumerable.Empty<SchoolyearDTO>()));

public async Task<IEnumerable<SchoolyearDTO>> GetSchoolyearsAsync()
{
    var schoolyears = await ...
}

它弹出字符串并打印出那个字符串。然后在第二次调用中,因为输出流中没有更多数据,所以发生文件结束异常。

您可以尝试将弹出的字符串存储到变量中,然后将其打印出来:

  dataInputStream.readUTF();

答案 2 :(得分:0)

删除问题专栏

message = dataInputStream.readUTF(); //&lt; ---问题行