0

我收到很多连接重置错误,通过调试我发现代码在这些行中找到:

//set up output stream for objects
output = new ObjectOutputStream(socket.getOutputStream());
output.flush(); //flush the output buffer to send header information
// Read a message sent by client application
ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();

错误发生在这一行:

String message = (String) ois.readObject();

错误信息:

java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)
        at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at org.bitbucket.c4d3r.ConnectionListener.listen(ConnectionListener.java:47)
        at org.bitbucket.c4d3r.ConnectionListener.<init>(ConnectionListener.java:27)
        at org.bitbucket.c4d3r.ConnectionHandler.connectionServer(ConnectionHandler.java:46)
        at org.bitbucket.c4d3r.ConnectionHandler.run(ConnectionHandler.java:24)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

我知道连接重置是由意外关闭的套接字引起的,但是我对套接字很陌生,我无法找到我做错了什么。因此,我希望有人可以帮助我解决这个问题。为了更好地了解所有内容,我在下面复制了更大的代码块

private DomainController dc;
    private Socket socket;
    private boolean changed;
    private ObjectOutputStream output;
    private ObjectInputStream ois;
    private Map json;

    public ConnectionListener(DomainController dc, Socket socket) {
        this.dc = dc;
        this.socket = socket;
        listen();
    }

    @Override
    public void run() {

        listen();
        return;
    }

    @SuppressWarnings("finally")
    public void listen() {
        try
        {
            //set up output stream for objects
            output = new ObjectOutputStream(socket.getOutputStream());
            output.flush(); //flush the output buffer to send header information
            // Read a message sent by client application
            ois = new ObjectInputStream(socket.getInputStream());

            String message = (String) ois.readObject();
            boolean inProgress;
            //CHECK IF THERE ARE GIVEN COMMANDS
            if(message.substring(0, 8).equalsIgnoreCase("COMMAND="))
            {
                switch(message.substring(8))
                {
                case "askMinigames":
                    //System.out.println("Sending minigames list");
                    output.writeObject(new String(dc.getProp().getProperty("minigames")));
                    output.flush(); //flush output to client
                    break;
                }
            }
        } catch (SocketException ex) {
            System.out.printf("Connection reset\n");
            ex.printStackTrace();
        } catch (IOException e) {
            System.out.println("Input exception");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try
            {
                if(ois != null) {
                    ois.close();
                }
                if(output != null) {
                    output.close();
                }
                if(socket != null) {
                    socket.close();
                }
            }
            catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
}
4

1 回答 1

1

您需要在两端的套接字生命周期内使用相同的对象输入和输出流。由于您只是发送字符串,我根本不明白您为什么要使用对象流:您可以使用例如 DataOutputStream.writeUTF() 和 DataInputStream.readUTF()。

于 2013-06-16T00:36:38.123 回答