Java Sockets,Java.net.SocketException:连接重置,因为BufferedWriter/Reader?
这只是一个非常简单的服务器/客户机应用程序,我用Java编写,目的是只使用BufferedReader和BufferedWriter。 我启动服务器时没有收到任何错误 但当客户端尝试向服务器发送消息时: java.net.SocketException:连接重置 出现了。我不知道为什么会发生这种情况,但我认为这可能与BufferedWriter有关。 我在网上搜索过,但没有找到任何有用的东西 Server.javaJava Sockets,Java.net.SocketException:连接重置,因为BufferedWriter/Reader?,java,sockets,bufferedwriter,Java,Sockets,Bufferedwriter,这只是一个非常简单的服务器/客户机应用程序,我用Java编写,目的是只使用BufferedReader和BufferedWriter。 我启动服务器时没有收到任何错误 但当客户端尝试向服务器发送消息时: java.net.SocketException:连接重置 出现了。我不知道为什么会发生这种情况,但我认为这可能与BufferedWriter有关。 我在网上搜索过,但没有找到任何有用的东西 Server.java import java.io.*; import java.net.*; pu
import java.io.*;
import java.net.*;
public class Server {
public Server(int port) {
try {
ServerSocket seso = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Server listening on port " + port);
Socket client1 = seso.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(client1.getInputStream(), "UTF-8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client1.getOutputStream(), "UTF-8"));
String s = null;
while((s = reader.readLine()) != null) {
System.out.println("Client: " + s);
}
writer.close();
reader.close();
} catch (Exception e) {e.printStackTrace();}
}
public static void main(String args[]) {
new Server(4444);
}
}
import java.io.*;
import java.net.*;
public class Client {
public Client(String serverip) {
try {
Socket client = new Socket(serverip, 4444);
System.out.println("Client connected with: " + serverip);
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
writer.write("Hello Server");
writer.flush();
}catch(Exception e){e.printStackTrace();}
}
public static void main(String args[]) {
new Client("localhost");
}
}
Client.java
import java.io.*;
import java.net.*;
public class Server {
public Server(int port) {
try {
ServerSocket seso = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Server listening on port " + port);
Socket client1 = seso.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(client1.getInputStream(), "UTF-8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client1.getOutputStream(), "UTF-8"));
String s = null;
while((s = reader.readLine()) != null) {
System.out.println("Client: " + s);
}
writer.close();
reader.close();
} catch (Exception e) {e.printStackTrace();}
}
public static void main(String args[]) {
new Server(4444);
}
}
import java.io.*;
import java.net.*;
public class Client {
public Client(String serverip) {
try {
Socket client = new Socket(serverip, 4444);
System.out.println("Client connected with: " + serverip);
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
writer.write("Hello Server");
writer.flush();
}catch(Exception e){e.printStackTrace();}
}
public static void main(String args[]) {
new Client("localhost");
}
}
当我运行服务器和客户机时,我从控制台得到:
Server started
Server listening on port 4444
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at Server.<init>(Server.java:24)
at Server.main(Server.java:33)
BUILD SUCCESSFUL (total time: 9 seconds)
之后
在Client.java中,我仍然得到:
Server started
Server listening on port 4444
Client: Hello Server
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at Server.<init>(Server.java:24)
at Server.main(Server.java:33)
BUILD SUCCESSFUL (total time: 2 seconds)
服务器已启动
在端口4444上侦听的服务器
客户端:你好,服务器
java.net.SocketException:连接重置
位于java.net.SocketInputStream.read(SocketInputStream.java:209)
位于java.net.SocketInputStream.read(SocketInputStream.java:141)
位于sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
位于sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
位于sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
位于java.io.InputStreamReader.read(InputStreamReader.java:184)
在java.io.BufferedReader.fill中(BufferedReader.java:161)
在java.io.BufferedReader.readLine(BufferedReader.java:324)
位于java.io.BufferedReader.readLine(BufferedReader.java:389)
在服务器上。(Server.java:24)
位于Server.main(Server.java:33)
生成成功(总时间:2秒)
您没有完全关闭客户端中的套接字或流。是的,并且您没有发送“\n”,因此服务器的读取挂起。确切地说,您没有关闭套接字,并且在Windows上运行了客户端(但没有这样说)。Windows进程(Java或其他)在未关闭其打开的TCP套接字的情况下终止会导致“异常终止”或连接重置,对于Java对等进程,这会导致出现异常,但在Unix上执行同样的操作不会。非常感谢您的回答。您知道如何正确关闭套接字/流吗?好的,多亏了大家,我已经解决了这个问题:)。