java.net.SocketException: Connection reset

报错:

java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:270)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:313)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at Main.start(Main.java:23)
    at Main.(Main.java:60)
    at Main.main(Main.java:63)

代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.*;
import java.io.*;
public class Main extends JFrame{
    ServerSocket server;
    Socket client;
    PrintWriter writer;
    JTextArea jta;
    void start() {
        try {
            server=new ServerSocket(8947);
            jta.append("ServerSocket创建成功\n");
            while (true) {
                jta.append("等待连接中……\n");
                client=server.accept();
                jta.append("连接完成\n");
                writer=new PrintWriter(client.getOutputStream(),true);
                BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
                while (true) {
                    String message=reader.readLine();
                    if (message.equals("#exit")) {
                        jta.append("对方已退出\n");
                        break;
                    }
                    jta.append(message);
                }
                reader.close();
                client.close();
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    public Main(){
        setTitle("TalkOne-on-OneServer");
        setSize(350,200);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        jta=new JTextArea();
        JTextField jtf=new JTextField();
        JScrollPane jsp=new JScrollPane(jta);
        Container container=getContentPane();
        container.add(jsp,"Center");
        container.add(jtf,"South");
        jtf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (client!=null) {
                    jta.append(jtf.getText() + '\n');
                    jtf.setText("");
                    writer.println(jtf.getText());
                }
            }
        });
        this.setVisible(true);
        start();
    }
    public static void main(String[] args) {
        new Main();
    }
}

客户端没有报错。双方都收不到对方的消息。

是刚开始发数据,就立刻报这个异常吗?如果是则检查一下是否socket被异常关闭了。
如果不是,检查下是否连接断掉后还在写或读

首先,这个代码就是简单的Java Socket网络编程,只不过包了一层可视化界面的壳,可视化使用过时的java awt和swing技术,这两个组件(package)完全没有学习的必要。
其次,你贴出来的代码没有任何问题,启动一个ServerSocket,其端口是8947。
根据Socket网络编程的套路,你还需要一个Client Socket,可以用代码来实现,也可以通过cmd。
具体来说,输入cmd打开一个命令输入框,输入命令:telnet localhost 8947,并回车

img

在这个界面输入数字或字符串等,然后回车,则可以在ServerSocket JComponent 看到你输入的字符:

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^