关于java的Socket的一个问题

服务端

package 手写服务器一;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//////////////////
public class Server {
private ServerSocket server;

public static void main(String[] args) {
    Server s=new Server();
    s.start();
}
//创建客户端
private void start(){
    try {
        server=new ServerSocket(9999);
        this.receive();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
//接收数据
private void receive(){
    try {
        Socket socket=server.accept();
        StringBuilder msg=new StringBuilder();
        String str=null;
        BufferedReader reader=new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        while((str=reader.readLine()).length()>0)
        {
            msg.append(str);
            msg.append("\r\n");
        }
        System.out.println(msg.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

客户端
package 客户端;
///////////
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
////////////
public class Client {
public static void main(String[] args) throws IOException{
@SuppressWarnings("resource")
Socket socket=new Socket(InetAddress.getLocalHost(),9999);
BufferedWriter writer=new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
writer.write("我是");
writer.newLine();
writer.flush();
}
}
//////////
错误为: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.receive(Server.java:34)
at 手写服务器一.Server.start(Server.java:20)
at 手写服务器一.Server.main(Server.java:14)
///////////////
客户端访问会报上面的错误,错误在服务端的接收数据的while循环那里;
主要想问一下为什么会报这样的错,改进可以不要,
但是如果我用浏览器访问这个服务器,却不会报错,这是为什么呢,
这里主要问一下为什么会出这样的错,改进可以不要。

在你的这段代码里,犯了两个错误

  1. 在客户端编码中,你没有关闭输出流和socket 你所得到的java.net.SocketException: Connection reset也是因为客户端退出时,没有关闭连接引起的。 建议修改 public class Client { public static void main(String[] args) throws IOException{ Socket socket=new Socket(InetAddress.getLocalHost(),9999); BufferedWriter writer=new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); writer.write("我是"); writer.flush(); writer.close(); socket.close(); } }
  2. 在服务端代码中,while的条件写错 错误代码: BufferedReader reader=new BufferedReader( new InputStreamReader(socket.getInputStream())); while((str=reader.readLine()).length()>0) { msg.append(str); msg.append("\r\n"); } 建议将while的循环条件改为: BufferedReader reader=new BufferedReader( new InputStreamReader(socket.getInputStream())); while((str=reader.readLine()) != null) { msg.append(str); msg.append("\r\n"); } 在readLine方法中,若无内容返回null而不是空字符串。

希望你在编程的时候,养成资源释放的好习惯

楼上正解

你的客户端处理有问题,此处发生java.net.SocketException: Connection reset异常的原因:当Client的main结束而退出了,但是没有关闭Socket,而服务器端的连接仍在继续等待读取请求数据。
修正你的客户端代码,最后加一个行,或者socket.close()都可以关闭Socket连接:

 writer.close();

服务器端的while读取数据判断有问题,没有数据时readLine返回的是null。你的判断条件是会报指针异常的。修改如下:

 while ((str = reader.readLine())!=null) {
    msg.append(str);
    msg.append("\r\n");
}

两处修改下,就能正确执行了。