Java:Android - 使用Objectstream的服务器套接字EOFException

时间:2014-08-09 02:19:38

标签: java android sockets

我是服务器套接字的新手,试图学习如何编写套接字(我已经使用了像winsock这样的套接字的经验,但这是我第一次在java中编写一个套接字)。

这是我不断得到的错误:

Couldn't get I/O for the connection to: 0
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)

这是代码:

public static void main(String args[]) {
    ServerSocket MyService = null;
    Socket clientSocket = null;
    Integer clientNum = 0;
    Integer inputID, outputID;

        try {
            MyService = new ServerSocket(hidden);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {

            clientSocket = MyService.accept();

            ObjectInputStream input = new ObjectInputStream(clientSocket.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(clientSocket.getOutputStream());


            Float inputFloat = null;
            Float outputFloat = null;

            Protocol protocol = new Protocol();

            outputFloat = protocol.processFloatInput(null);

            while(true) {
                if(input.readObject().getClass().equals(inputFloat.getClass())) {
                    System.out.println("true");
                    if ((inputFloat = input.readFloat()) != null) {
                        outputFloat = protocol.processFloatInput(inputFloat);
                        output.writeObject(outputFloat);
                        System.out.println("Float value = " + inputFloat);

                    }
                    input.close();
                    output.flush();
                    output.close();
                }
                if(input.readObject().getClass().equals(Integer.TYPE)) {
                    if ((inputID = input.readInt()) != null) {
                        outputID = protocol.processIntegerInput(inputID);
                        output.writeObject(inputID);
                        System.out.println("Client " + outputID + " connected.");

                    }
                    input.close();
                    output.flush();
                    output.close();
                }
            }

        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: hostname");
        } catch (IOException e) {
            //Error printed
            System.err.println("Couldn't get I/O for the connection to: " + clientNum);
            e.printStackTrace();
        } catch (Exception e) {

            e.printStackTrace();
        }   


};

在过去的测试中,我能够连接到服务器,但由于我想在操作之前检查输入数据类型,我得到了这个。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

EOFException只是意味着你到达了流的末尾。这很正常。

你的问题是你为每个写的对象读了两次:一次得到它的类,然后再次得到对象。你没有再次得到同一个对象,你得到了下一个对象,所以你最终会用完。

你需要将readObject()的结果存储在一个变量中,然后测试它的类,然后适当地转换它。