java - 我得到一个 java.net.SocketException : Connection reset error

标签 java multithreading

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

public class Server {
    // ArrayList<PrintWriter> writers; // hold a list of current connections
    Set<Socket> sockets = new HashSet<Socket>();
    private ServerSocket serverSocket;
    private Socket sock;
    private static SimpleDateFormat date = new SimpleDateFormat(
            "dd/mm/yyyy hh:mm:ss");
    private static Calendar cal = Calendar.getInstance();

    public static void main(String[] args) {
        new Server().go();
    }

    public void go() {
        try {
            // setup port listener
            // add connections to arraylist
            // setup in and out streams
            System.out.println("waiting connetion");
            serverSocket = new ServerSocket(8999);
            // writers = new ArrayList<PrintWriter>();

            while (true) {
                sock = serverSocket.accept();
                sockets.add(sock);
                // PrintWriter writer = new PrintWriter(
                // sock.getOutputStream());
                // writers.add(writer);
                Thread t = new Thread(new ClientHandler(sock));
                t.start();
                System.out.println("connected");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("fail setup network");

        } finally {
            System.out.println("finally");

        }
    }

    class ClientHandler implements Runnable {
        private BufferedReader in;

        public ClientHandler(Socket sock) {
            // setup a client connection
            try {
                in = new BufferedReader(new InputStreamReader(
                        sock.getInputStream()));
            } catch (IOException e) {
                e.printStackTrace();

                System.out.println("fail classhandler");
            }
        }

        @Override
        public void run() {
            // receive and relay messages back to clients
            String message;
            try {
                while ((message = in.readLine()) != null) {
                    shout(message);
                    System.out.println("client says : "
                            + date.format(cal.getTime()) + message);
                }
            } catch (IOException ex) {
                try {
                    System.out.println("closing");
                    sock.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                sockets.remove(sock);
                System.out.println(sockets);
                ex.printStackTrace();
                System.out.println("fail read message");

            }
        }

        public synchronized void shout(String message) {
            // send message to all clients
            // for (PrintWriter writer : writers) {
            // writer.println(date.format(cal.getTime()) + " " + message
            // + "\n");
            // writer.flush();
            // }
            for (Socket sock : sockets) {
                try {
                    PrintWriter writer = new PrintWriter(sock.getOutputStream());
                    writer.println(date.format(cal.getTime()) + " " + message
                            + "\n");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }

}

============================================= ========

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;

    public class Client {

        private JTextArea tArea;
        private BufferedReader in;
        private Socket sock;
        private PrintWriter out;

        public static void main(String[] args) {
            new Client().go();
        }

        public void go() {
            JFrame frame = new JFrame("Chat Client");
            final JTextField tField = new JTextField(25);
            tArea = new JTextArea(30, 20);
            JButton button = new JButton("send");
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    sendMessage(tField.getText());
                    tField.setText("");
                }
            });
            frame.setSize(300, 500);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(tArea, BorderLayout.NORTH);
            frame.add(tField, BorderLayout.CENTER);
            frame.add(button, BorderLayout.EAST);
            frame.pack();
            setupNetwork();
            Thread t = new Thread(new IncomingReader());
            t.start();
        }

        public void setupNetwork() {
            try {
                sock = new Socket("localhost", 8999);
                in = new BufferedReader(
                        new InputStreamReader(sock.getInputStream()));
                out = new PrintWriter(sock.getOutputStream());
            } catch (IOException ex) {
                ex.printStackTrace();
                System.out.println("fail networking");


}
    }

    class IncomingReader implements Runnable {
        public void run() {
            //receive messages from server
            try {
                String message = null;
                while ((message = in.readLine()) != null) {
                    tArea.append(message + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("fail incoming reader");

            }
        }
    }

    public void sendMessage(String message) {
        try {
            out.println(message);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("fail send message");
        }
    }
}

当我关闭客户端时出现此错误,我尝试了一些关闭连接的方法,但最终我不确定如何消除此错误:

fail read message
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at Server$ClassHandler.run(Server.java:63)
    at java.lang.Thread.run(Unknown Source)

我知道这是因为我正在关闭一个连接,但它一直抛出这个错误并且很烦人,即使它没有破坏我的服务器。

最佳答案

通常的原因是你写入了一个已经被另一端关闭的连接。换句话说,应用程序协议(protocol)错误。

这里的具体问题是,当您从服务器中的readLine() 获取null 时,您应该关闭该套接字并删除相应的Writer 来自要大喊大叫的作家数组。

关于java - 我得到一个 java.net.SocketException : Connection reset error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340806/

相关文章:

c++ - 如何使队列上的推送和弹出成为原子操作,如何锁定这些操作?

c - 为什么 pthread_cond_signal 有时不起作用?

c++ - Clang 替换 -mthreads 选项

c# - 将 db 对象发送到新线程的类

java - Android Espresso,如何继续执行 onLongClick 和 slideDown?

c++ - Boost Thread - 创建一个没有 join() 的线程

java - Spring:如何解析上传的zip文件?

java - 我需要一排矩形,如何自动命名它们的变量?

java - 如何在不返回集合本身的情况下返回集合的数据?

java - 当编译时数据模式未知时从 URL 解析 JSON 数组