我有Client类和Server类,但是当我运行两个main方法然后什么都不会发生时,当我停止运行时,将发生此异常。为什么??请帮帮我,我该怎么办?
我的客户端类:
public class Client {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
Socket c = new Socket("localhost", 5001);
BufferedReader read = new BufferedReader(new InputStreamReader(c.getInputStream()));
BufferedWriter write = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
String string = reader.readLine();
write.write(string, 0, string.length());
write.newLine();
write.flush();
System.out.println(read.readLine());
} catch (Exception e) {
System.err.println(e);
}
}}
我的服务器类:
public class Server{
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ServerSocket s = null;
try {
s = new ServerSocket(5001);
System.out.println("listening...");
Socket so = s.accept();
BufferedReader read = new BufferedReader(new InputStreamReader(so.getInputStream()));
BufferedWriter write = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
while (true) {
String string = read.readLine();
System.out.println(string);
String answer = "I got" + string + "from you!";
write.write(answer, 0, answer.length());
write.newLine();
write.flush();
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}}
服务器cpnsole中的stacktrace:
run:
listening...
system connected
Hello
Dec 19, 2009 12:58:15 PM server.Main main
SEVERE: null
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at server.Main.main(Main.java:37)
BUILD SUCCESSFUL (total time: 9 seconds)
客户端控制台中的:
run:
Hello
I gotHellofrom you!
BUILD SUCCESSFUL (total time: 4 seconds)
答案 0 :(得分:3)
您的客户端连接到服务器,发送一些数据,读取响应并终止。没关系。
但是您的服务器等待客户端,读取其数据,写入响应,然后尝试再次从客户端读取一些数据。但是客户关闭了连接。因此,服务器会获得您描述的异常。
要解决此问题(在服务器端),您必须在Socket so = s.accept();
循环中执行while
。并且不要忘记在循环结束时关闭套接字。
答案 1 :(得分:0)
首先。 BufferedWriter
对Sockets
无用。使用PrintWriter
自动刷新。
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// true means "flush automatically"
writer.println(reader.readLine());
// Now you don't have to add a newline and flush.
其次。抛出异常的原因是因为客户端在将输入写入服务器后关闭了Socket。服务器仍在等待另一个String读取。但他不能因为Socket被关闭了。你没有按字面意思关闭它。但该计划在那里结束。所以Java认为:“没有什么可做的,退出”。通过退出,连接关闭。
要解决此问题,您必须将通信置于while(true)
循环中,并以正确方式停止连接,发送“连接结束”消息。
客户端:
while (true)
{
String userinput = reader.readLine(); // From System.in
writer.writeln(userinput);
if (userinput.equals("end"))
{
socket.close();
break; // break out of the while(true) loop
}
}
服务器端:
while (true) {
String socketinput = reader.readLine();
if (socketinput.equals("end"))
{
socket.close();
break; // Break out of the while(true) loop.
}
... // Handle the socketInput
}
这也是“Connection reset
”的含义。
马亭。