繁体   English   中英

客户端断开连接时服务器挂起

[英]Server hangs when client disconnects

每当任何客户端从我的服务器断开连接时,我都将挂起一个多客户端/服务器应用程序。 我如何设置任何条件,只要有任何客户端与服务器断开连接,这将告诉我打印一些消息,这是我的服务器代码

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            System.out.println("server starting.......");
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {

            try {
                System.out.println("Ready to accept.......");
                socket = serverSocket.accept();

                System.out.println(" client Connected with ip address =" +socket.getRemoteSocketAddress().toString());

                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("catch block");

            }

        }
    }
}

class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {

            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {


        while (!Thread.currentThread().isInterrupted()) {

            try {

                String read = input.readLine();

                updateConversationHandler.post(new updateUIThread(read));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

任何帮助将不胜感激

目前尚不清楚您是要断开连接是因为对话已结束(即,一切都已成功完成),还是断开连接是由于某些网络问题(或客户端取消了请求)。

如果是第一种情况,那就很简单:您使用的协议(您自己的协议,http或其他协议)负责定义如何确定对话是否结束。 如果出现这种情况,则只需关闭插座即可。

如果是第二种情况,则必须使用适当的算法来确定是否必须关闭连接。 例如,通过实施超时或慢速读取阈值。 查看Socket的javadoc,了解有关如何设置超时的说明。

还值得注意的是,当您想练习或学习一些东西时创建自己的服务器是可以的,但是最好使用现有的解决方案,例如vert.x或精简版的Wildfly。 如今,此类服务器的开销非常低,同时仍提供非常强大的联网功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM