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那里会出错,这是为什么呢,又应该怎么改进呢,使
服务器可以循环接收,但是但我用浏览器访问服务器端时确不会出错,求大神解答。

主要问一下为什么会出这样的错,改进可以次要。

我的电脑在局域网里面,ip为10.13.45.178web server用的是tomcat5.0.30,端口为8080;我的代码只有一句。如下:Socket s = new Socket("10.13.45.178",8080);但是这一句代码要运行17秒钟左右,但是如果我把上面的代码改成如下:Socket s = new Socket("localhost",8080);时间就会立即提升到30微......
答案就在这里:问一个关于java Socket编程的问题。
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

http://bj.java.tedu.cn/?java360tg=J10=150807415

http://bj.java.tedu.cn/?java360tg=J10=150807415

服务端:
public class Server {
public static void main(String[] args) {
//启动一个服务 监听8888端口
try {
ServerSocket ss=new ServerSocket(8888);
//阻塞 接收客户端的请求
//当客户端连接成功后将会返回socket
while(true){
Socket socket=ss.accept();
System.out.println("有客户端连接:"+socket.getInetAddress());
//启动工作线程

//让工作线程继续处理该连接
new ServerThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

static class ServerThread extends Thread{
    private Socket socket;
    public ServerThread(Socket socket) {
        this.socket=socket;
    }
    public void run() {
        try {
            //模仿 卖东西
            DataOutputStream os=
                    new DataOutputStream(
                            socket.getOutputStream());
            DataInputStream is=
                    new DataInputStream(
                            socket.getInputStream());
            os.writeUTF("欢迎光临,要点什么?");
            os.flush(); //输出到客户端
            while(true){
                //获取客户端输入进来的内容
                String str=is.readUTF();
                if(str.equals("不要了")){
                    os.writeUTF("好的,稍等。");
                    os.flush();
                    break;  //跳出循环
                }
                os.writeUTF("您点了:"+str+", 还要点什么?");
                os.flush();
            }
            os.close();
            is.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}
客户端:
public class Client {
public static void main(String[] args) {
//创建Socket对象 连接服务端
try {
Socket socket=new Socket("127.0.0.1", 8888);
DataInputStream is=
new DataInputStream(
socket.getInputStream());
DataOutputStream os=
new DataOutputStream(
socket.getOutputStream());
String str=is.readUTF();
System.out.println(str);
//客户端通过控制台进行输入
Scanner sc=new Scanner(System.in);
//获取用户输入的字符串
String line=sc.nextLine();
os.writeUTF(line);
os.flush();
while(true){
//获取服务端写到客户端的数据
str=is.readUTF();
System.out.println(str);
if(str.equals("好的,稍等。")){
break;
}
//回答
line=sc.nextLine();
os.writeUTF(line);
os.flush();
}
os.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("连接关闭..");
e.printStackTrace();
}
}
}

你的客户端处理有问题,此处发生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");
}

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

楼上正解
你服务端读取数据时不应该判断length>0,因为str可能是null,会报空指针的。。。