Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查服务器上的客户端套接字是否已关闭_Java_Sockets - Fatal编程技术网

Java 检查服务器上的客户端套接字是否已关闭

Java 检查服务器上的客户端套接字是否已关闭,java,sockets,Java,Sockets,如何在服务器端检查客户端是否关闭了套接字 我有一台服务器,它等待连接,然后向客户端返回10条消息: public class SocketServidor { static ServerSocket serverSocket; public static void main(String[] args) throws Exception { serverSocket = new ServerSocket(5963); while(true) {

如何在服务器端检查客户端是否关闭了套接字

我有一台服务器,它等待连接,然后向客户端返回10条消息:

public class SocketServidor {
    static ServerSocket serverSocket;

    public static void main(String[] args) throws Exception {
        serverSocket = new ServerSocket(5963);
        while(true) {
            final Socket socket = serverSocket.accept();
            new Thread(() -> {
                try {
                    PrintWriter out = new PrintWriter(socket.getOutputStream());
                    for (int i = 0; i < 10; i++) {
                        int valor = (int) (Math.random() * 5) + 1;
                        out.println("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
                        out.flush();
                        Thread.sleep(valor*1000);
                    }
                    socket.close();
                } catch (Exception ex) {
                    Logger.getLogger(SocketServidor.class.getName()).log(Level.SEVERE, null, ex);
                }
            }).start();
        }
    }
}

问题是,即使在第五次读取之后,当客户端关闭套接字时,服务器仍会继续向客户端发送消息。当客户端关闭服务器端的套接字时,如何关闭服务器端的套接字?

PrintWriter.flush()会抑制该异常 您看不到异常,因为PrintWriter.flush()抑制了该异常。要检查
PrintWriter.println()
之后的错误状态,可以使用
PrintWriter.checkError()
而不是
flush()
。或者,您可以使用
OutputStreamWriter
而不是
PrintWriter
,这样就不会抑制执行

  • 带校验错误

    serverSocket = new ServerSocket(5963);
    while(true) {
        final Socket socket = serverSocket.accept();
        new Thread(() -> {
            try {
                PrintWriter out = new PrintWriter(socket.getOutputStream());
                for (int i = 0; i < 10; i++) {
                    int valor = (int) (Math.random() * 5) + 1;
                    out.println("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
                    //out.flush();
                    if(out.checkError()){
                        System.out.println("Error. Break");
                        break;
                    }
                    Thread.sleep(valor*1000);
                }
                socket.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }).start();
    }
    
    serverSocket=新的serverSocket(5963);
    while(true){
    最终套接字=serverSocket.accept();
    新线程(()->{
    试一试{
    PrintWriter out=新的PrintWriter(socket.getOutputStream());
    对于(int i=0;i<10;i++){
    intvalor=(int)(Math.random()*5)+1;
    out.println(“Voc#acabou de ganhar R$”+新的十进制格式(“0.00”)。格式(valor)+“!”;
    //out.flush();
    if(out.checkError()){
    System.out.println(“Error.Break”);
    打破
    }
    线程。睡眠(valor*1000);
    }
    socket.close();
    }捕获(例外情况除外){
    例如printStackTrace();
    }
    }).start();
    }
    
  • 使用OutputStreamWriter

    serverSocket = new ServerSocket(5963);
    while(true) {
        final Socket socket = serverSocket.accept();
        new Thread(() -> {
            try {
                Writer out = new OutputStreamWriter(socket.getOutputStream());
                for (int i = 0; i < 10; i++) {
                    int valor = (int) (Math.random() * 5) + 1;
                    out.write("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
                    out.write("\r\n");
                    out.flush();
                    Thread.sleep(valor*1000);
                }
                socket.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }).start();
    }
    
    serverSocket=新的serverSocket(5963);
    while(true){
    最终套接字=serverSocket.accept();
    新线程(()->{
    试一试{
    Writer out=新的OutputStreamWriter(socket.getOutputStream());
    对于(int i=0;i<10;i++){
    intvalor=(int)(Math.random()*5)+1;
    输出。写入(“Voc#acabou de ganhar R$”+新的十进制格式(“0.00”)。格式(valor)+“!”;
    out.write(“\r\n”);
    out.flush();
    线程。睡眠(valor*1000);
    }
    socket.close();
    }捕获(例外情况除外){
    例如printStackTrace();
    }
    }).start();
    }
    

  • 在这里检查我的答案,我看不出在服务器端使用循环的原因。为什么不将这个循环移动到客户端,让客户端定期向服务器请求数据?
    serverSocket = new ServerSocket(5963);
    while(true) {
        final Socket socket = serverSocket.accept();
        new Thread(() -> {
            try {
                Writer out = new OutputStreamWriter(socket.getOutputStream());
                for (int i = 0; i < 10; i++) {
                    int valor = (int) (Math.random() * 5) + 1;
                    out.write("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
                    out.write("\r\n");
                    out.flush();
                    Thread.sleep(valor*1000);
                }
                socket.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }).start();
    }