0

EDIT:サーバー側で、ServerWriterクラスのrunメソッドからコードを削除してsend orderメソッドに入れ、スレッド用のコードを削除すると、再び正常に動作し始め、ソケットが閉じません。しかし、マルチスレッドにする必要があります。ソケットがスレッドで閉じる理由がわかりません。コードを以下に示します

    public void sendOrder(Order o){
//      ServerWriter sw=new ServerWriter(serversocket,o);
//      Thread t=new Thread(sw);
//      t.start();
        ObjectOutputStream out=null;
        if(serversocket.isClosed()){
            System.out.println("closed");
        }
        else{
            System.out.println("notclosed");
        }
        try {
            out=new ObjectOutputStream(serversocket.getOutputStream());
            out.writeObject(o);
            out.reset();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

編集:ソケットはクライアント側ではなくサーバー側で閉じていると思います。サーバーの出力からこれを推測すると、チェックisclosed()時に closed が出力されますが、クライアント側では Not Closed

私はソケットプログラムを持っています。クライアント1には、ソケットを開くための2つのメソッドと、データを読み取るための2つのメソッドがあります。このコードを実行しようとするたびにeofexception、ソケットが閉じていることを意味します。

数日前にこのコードに最後に取り組んでいたときにこのエラーが発生したので、すべてのコードを読み取りから削除して open メソッドに貼り付けたところ、動作し始めました (理由がよくわかりませんでした)。

今日、私は元に戻り、コードを読み取りメソッドに戻しただけで、すべてが完全に機能し始めました.接続はそれ自体では閉じられませんでした. 次に、読み取り部分をスレッドにしましたが、すべてが正常に機能していました。コードの書き込み部分で作業していましたが、実行するとeofexception再び同じになり、読み取りコードは何も変更していないので、なぜこれが起こっているのか分かりません。サーバー側では、メソッドでソケットを受け入れ、スレッドを介してデータを送信するという同様のことを行いました。サーバー側では、SocketException が発生します。

私が間違っていることに光を当てるのに、私は本当に助けを使うことができました.

以下はクライアント側のコードです

public void open(){
    try
    {
        s=new Socket(InetAddress.getLocalHost(),12345);

        s.setKeepAlive(true);

    }

    catch(UnknownHostException u)
    {
        System.err.println("I don't know host");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 


}



public void read(){
    ClientReader cr=new ClientReader(s);
    Thread t=new Thread(cr);
    t.start();
}


class ClientReader implements Runnable{
    Socket s;
    ClientReader(Socket s){
        this.s=s;
    }
    public void run(){
        InputStream is;
        ObjectInputStream ois=null;
        try {
            is = s.getInputStream();
                    if(!(s==null)){
                System.out.println("not null");
            }
                    **//outputs NotClosed here**
        if(s.isClosed()){
            System.out.println("CLOSED");
        }
                    else system.out.println("Not Closed")

              //Throws EOFException here
         ois= new ObjectInputStream(is); 
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        Order order;
         while(true){
             try{
             order=(Order)ois.readObject();
             Client_Socket.ll.add(order);
            System.out.println(order);
            System.out.println(order.getTotal()); 

             }
             catch(EOFException e){

                 try{
                 ois.close();
                 s.close();
                 break;

             } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
             } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         }
    }
}

クライアントを呼び出すための主なメソッド

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Client_Socket cs=new Client_Socket();
    cs.open();
    cs.read();

}

クライアント側の例外

not null
Not Closed

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)
    at ClientReader.run(Client_Socket.java:82)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-0" java.lang.NullPointerException
    at ClientReader.run(Client_Socket.java:91)
    at java.lang.Thread.run(Unknown Source)

サーバー側の例外

Connection from Socket[addr=/192.168.0.108,port=50380,localport=12345]
closed

java.net.SocketException: Socket is closed
    at java.net.Socket.getOutputStream(Unknown Source)
    at ServerWriter.run(Server_Socket.java:123)
    at java.lang.Thread.run(Unknown Source)

サーバー側のコード スニペット

public void openSocket(){
    try
    {
        service=new ServerSocket(12345);

        serversocket=service.accept();
        serversocket.setKeepAlive(true);
        System.out.println("Connection from "+serversocket);



    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("output stream error");
        System.out.println(e);
    }

}


public void sendOrder(Order o){
    ServerWriter sw=new ServerWriter(serversocket,o);
    Thread t=new Thread(sw);
    t.start();

}


class ServerWriter implements Runnable{
    Socket serversocket;
    Order o;
    ServerWriter(Socket s,Order o){
        this.serversocket=s;
        this.o=o;
    }

    public void run() {
        ObjectOutputStream out=null;
        if(serversocket.isClosed()){
            System.out.println("closed");
        }
        else{
            System.out.println("notclosed");
        }
        try {
            //SocketException here
            out=new ObjectOutputStream(serversocket.getOutputStream());
            out.writeObject(o);
            out.reset();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

サーバーを呼び出すためのメソッド スニペット

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Order o=new Order();
    Server_Socket ss=new Server_Socket();
    ss.openSocket();
    ss.sendOrder(o);
    ss.close();
}
4

1 に答える 1

3

この例外は、ソケット閉じてから引き続き使用することを意味します。ピアとは何の関係もありません。

おそらく、ソケットの入力ストリームまたは出力ストリームのいずれかを閉じると、他のストリームとソケットが閉じられることに気付いていない可能性があります。

于 2012-10-09T23:57:37.940 に答える