【问题标题】:java.net.SocketException: Socket is closed between Socket.accept() and Socket.getInputStream()java.net.SocketException:套接字在 Socket.accept() 和 Socket.getInputStream() 之间关闭
【发布时间】:2016-02-28 18:55:21
【问题描述】:

我正在尝试创建客户端/服务器连接,并且对 java 还是很陌生。所以我得到的错误告诉我套接字已关闭。经过一些工作,我设法在下面编写了给定的代码。我确实相信我将套接字传递给连接类的方式有问题,如果我不得不猜测,这会导致套接字对象可能被关闭吗?

我尝试添加等待以防服务器线程尚未执行,但这似乎没有影响任何事情。也许我应该在自己的命令提示符下使用自己的启动器启动服务器,但我认为这应该可以很好地测试客户端和服务器。

在我发送消息之前,我似乎无法找出我的套接字关闭的原因。任何见解将不胜感激!

谢谢!

错误

java.net.SocketException: Socket is closed
    at java.net.Socket.getInputSTream(Unknown Source)
    at Connection.run(Connection.java:17)

Server.java

//main calling snippet. 
import java.lang.Thread;

public class Server {
    public static void main(String[] args) {
        if(args.length != 1) {
            System.err.println("Usage: java Server <port number>");
            System.exit(1);
        }

        int port = Integer.parseInt(args[0]);
        Thread server = new KServer(port);
        server.start();
        //added waits just to make sure the thread was executed? 
        //thinking this might be my problem
        long t = System.currentTimeMillis() + 5000;
        while (System.currentTimeMillis() < t) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        KClient client = new KClient("127.0.0.1",port);
        while (!(client.openConn())) {
            System.out.println("Failed to connect.  Retrying...");
        }
        client.send("Hello World");
        client.closeConn();

    }
}

KServer.java

//the actual server class that manages listening and threading the sockets
import java.net.*;
import java.io.*;

public class KServer extends Thread {

    private int port;
    private ServerSocket sSock;

    public KServer(int thisPort) {
        port = thisPort;
        try {
           sSock = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();            
        }
    }

    public void run() {
        while(true) {
            try (Socket cSock = sSock.accept();) {
                Thread con = new Connection(cSock);
                con.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

Connection.java

//Manages sending and receiving messages

import java.net.Socket;
import java.io.*;

public class Connection extends Thread {

    Socket socket;

    public Connection(Socket s) {
        socket = s;
    }

    public void run() {     
        String msg;
        BufferedReader in;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while((msg = in.readLine()) != null) {
                System.out.println(msg);
            }   
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

KClient.java

//manages the clients connection life to the server
import java.net.*;
import java.io.*;

public class KClient {

    private Socket sock;
    private String dest;
    private int port;

    private OutputStreamWriter out;

    public KClient(String dst,int prt) {
        dest = dst;
        port = prt; 
    }

    public boolean openConn() {

        try {
            sock = new Socket(dest,port);
            out = new OutputStreamWriter(sock.getOutputStream(),"ISO-8859-1");          
        } catch (Exception e) {
            e.printStackTrace();
            return false;

        }
        return true;
    }

    public void send(String msg) {
        try {
            out.write(msg);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void closeConn() {

        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



}

【问题讨论】:

    标签: java sockets network-programming client-server socketexception


    【解决方案1】:

    不要使用 try-with-resources 来接受套接字。它将关闭接受的套接字,该套接字需要保持打开状态,以便处理线程可以使用它。处理线程负责关闭它。

    【讨论】:

    • 你能解释一下发生了什么吗?我将它用作资源这一事实是否会杀死该 try 块之外的对象?所以套接字在尝试调用 getInputStream() 之前就被销毁了?
    • 感谢您对此保持冷静。你说它关闭它,但为什么呢?它会因为它被破坏而关闭它吗?除了关闭它之外,它还有更多内容。没有人让你回答这个问题,我想你喜欢讨论这些事情,否则你不会回答关于 SO 的问题。不是要浪费你的时间。感谢您的回答
    • 它关闭它因为这就是它的用途。它没有其他用途。我已经说了这么多。不信就去看看。当您不知道它们的含义时,我不知道您为什么要使用语言功能。要求我不断重复自己并不“酷”。如果您有反应,请不要感到惊讶。
    • @EJP 我认为你不需要那样粗鲁。事实上,您的答案并不清楚和理解!
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多