0

だから私はちょうどいくつかのクライアントサーバーのものをテストしています(私はより大きなプロジェクトでそれに取り組んでいましたが、エラーを投げ続けたので、私はそれを正しく行っていることを確認することにしました.私はそうではなかったことがわかりました)これには ObjectOutput が含まれますおよび入力ストリーム。クライアントとサーバーを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) {}
    }
}
4

1 に答える 1

1

クライアントでは、出力ストリームを閉じる前に、基になるソケット s を閉じています。これを試して:

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

oos.close() により、オブジェクト出力ストリームがすべてのデータをソケットにフラッシュしてから、オブジェクト ストリームを閉じる必要があります。次に、基になるソケットを閉じることができます。

于 2012-11-16T00:59:22.573 に答える