报错:
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,并回车
在这个界面输入数字或字符串等,然后回车,则可以在ServerSocket JComponent 看到你输入的字符: