套接字连接意外关闭

时间:2012-11-16 00:55:14

标签: java sockets object

所以我只是测试一些客户端 - 服务器的东西(我在一个更大的项目中正在研究它,但它一直在抛出错误,所以我决定确保我做得对。结果我不是) 它涉及ObjectOutput和Input流。当我在localhost上运行客户端和服务器时,它工作正常,但如果我在我的Linux服务器上运行服务器并在我的计算机上运行客户端,则当我到达提取对象的行时,连接已重置。这是代码:

客户端:

    public static void main(String[] args){
    String[] stuff = {"test", "testing", "tester"};
    Socket s = null;
    ObjectOutputStream oos = null;
    try {
        s = new Socket("my.server.website", 60232);
        oos = new ObjectOutputStream(s.getOutputStream());
        oos.writeObject(stuff);
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally{
        try {
            s.close();
            oos.close();
        } catch (IOException e) {}


    }
}

服务器:

    public static void main(String[] args){
    ServerSocket ss = null;
    Socket s = null;
    ObjectInputStream ois = null;
    try {
        ss = new ServerSocket(60232);
        s = ss.accept();
        System.out.println("Socket Accepted");
        ois = new ObjectInputStream(s.getInputStream());
        Object object = ois.readObject();
        System.out.println("Object received");
        if (object instanceof String[]){
        String[] components = (String[]) object;
        for (String string : components){
            System.out.println(string);
        }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }finally{
        try {
            ss.close();
            s.close();
            ois.close();
        } catch (IOException e) {}
    }
}

1 个答案:

答案 0 :(得分:1)

在客户端中,您在关闭输出流之前关闭了底层套接字。 试试这个:

try {
    oos.close();
    s.close();
} catch (IOException e) {}

oos.close()应该使对象输出流将其所有数据刷新到套接字,然后关闭对象流。然后你可以关闭底层套接字。