Java 插座一直关着

Java 插座一直关着,java,sockets,serversocket,Java,Sockets,Serversocket,编辑:在服务器端,如果我从ServerWriter类中的run方法中删除代码并将其放入send order方法,删除用于线程的代码,它将再次正常工作,套接字不会关闭。但是我需要它是多线程的,我不明白为什么套接字会用线程关闭。代码如下所示 public void sendOrder(Order o){ // ServerWriter sw=new ServerWriter(serversocket,o); // Thread t=new Thread(sw); //

编辑:在服务器端,如果我从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()
,而在客户端,它说notclosed()

我有一个套接字程序。客户端1中有两种方法用于打开套接字,另一种用于读取数据。每次尝试运行此代码时,我都会收到
eofexception
,这意味着套接字已关闭

几天前,我上一次编写这段代码时出现了这个错误,所以我只是从阅读中删除了所有代码,并将其粘贴到open方法中,然后它开始工作(我真的不明白为什么)

今天我恢复了,只是将代码移回read方法,一切都开始正常工作,连接没有自动关闭。然后我将读取部分设置为线程,但仍然一切正常,我正在处理代码的写入部分,现在当我运行它时,我再次得到相同的
EOFEException
,我没有更改读取代码中的任何内容,所以我不知道为什么会发生这种情况。在服务器端,我做了类似的事情,在方法中接受套接字并通过线程发送数据。在服务器端,我得到一个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();
            }
         }
    }
}
调用客户端的main方法

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)
服务器端代码片段

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();
}
该异常意味着您关闭了套接字,然后继续使用它。与同伴无关

您可能不知道关闭套接字的输入流或输出流会关闭另一个流和套接字。

该异常意味着您关闭了套接字,然后继续使用它。与同伴无关


您可能不知道关闭套接字的输入流或输出流会关闭另一个流和套接字。

您应该发布异常和stacktrace,因为您描述的内容有点不清楚。您应该检查“is”是否为null,而不是s是否关闭。它们是不同的对象,您不知道底层结构。@Greg Giacovelli我已经添加了exception@EnderWiggin我已经在服务器端检查过了,它说关闭了,在客户端它说未关闭。你知道端口不一样,对吗?您收听12345并发送连接至1234。。。输入错误?您应该发布异常和stacktrace,因为您描述的内容有点不清楚。您应该检查“is”是否为null,而不是s是否已关闭。它们是不同的对象,您不知道底层结构。@Greg Giacovelli我已经添加了exception@EnderWiggin我已经在服务器端检查过了,它说关闭了,在客户端它说未关闭。你知道端口不一样,对吗?您收听12345并发送连接至1234。。。输入错误?我还没有关闭流,你能看看我最近的编辑吗。我刚刚删除了线程,并将相同的代码复制到sendorder()中,它开始工作,但我需要线程。@yahh您肯定已经关闭了一些东西。例外情况是这样的。在您的代码中,有很多漏洞:s.getInputStream()永远不能为null;s、 isClosed()在调用s.getInputStream()的同一块中永远不能为true;除SocketTimeoutException之外的任何IOException都是致命的,必须导致关闭和“中断”;内部try/catch块太多;您应该在套接字的生命周期中使用相同的流,而不是为每条消息创建新的流。最后一个是问题的原因,因为您正在释放要由GC关闭的流,这将关闭套接字。我还没有关闭流,请查看我的最新编辑。我刚刚删除了线程,并将相同的代码复制到sendorder()中,它开始工作,但我需要线程。@yahh您肯定已经关闭了一些东西。例外情况是这样的。在您的代码中,有很多漏洞:s.getInputStream()永远不能为null;s、 isClosed()在调用s.getInputStream()的同一块中永远不能为true;除SocketTimeoutException之外的任何IOException都是致命的,必须导致关闭和“中断”;内部try/catch块太多;您应该在套接字的生命周期中使用相同的流,而不是为每条消息创建新的流。最后一个是问题的原因,因为您正在释放要由GC关闭的流,GC将关闭套接字。
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();
}