解决方案 »

  1.   

    应该是你把ServerSocket 关闭了: ss.close(); 
    而不是s.close();
      

  2.   

    你服务器端最后返回数据给客户端,数据发送完了当然要关闭socket,这样才是正常断开连接的程序,你不关的话,程序结束后,socket被JVM或者系统被动杀掉,而客户端还在那里等数据,客户端这里
    while((len=br1.readLine())!=null){
        System.out.println(len);
    }
    会不断尝试从服务器端接收数据,直到服务器端主动断开连接,如果服务器端以非正常形式断开连接,socket就会抛Connection Reset异常。总之socket用完不close,99%是错误的,虽然由于其他机制,在某些情况下就算不关也不会产生错误和严重后果,但这种做法依然是不好的。
      

  3.   


    关闭socket是正确的;
    其实上面的程序若保证了server端那个打开的socket,client端没有阻塞于此socket上的 I/O 操作,server端没有关闭socket,上面程序也是能运行的。如:import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;public class FileTransClient { public static void main(String[] args) throws IOException {
    //创建客户端对象
    Socket socket=new Socket("localhost",9999);
    //获取客户端的输出流对象
    OutputStream out=socket.getOutputStream();
    //使用字符打印流打印数据
    PrintWriter pw=new PrintWriter(out,true);
    //创建文件对象
    File file=new File("D:\\help.txt");
    //创建字符输入流读取文件
    BufferedReader br=new BufferedReader(new FileReader(file));
    String line=null;
    while((line=br.readLine())!=null){
    pw.println(line);
    }
    //告知服务端数据传送完毕
    socket.shutdownOutput();

    System.out.println("客户端已把文件传输完成!");
    //用来接收服务端返回的数据信息
    BufferedReader br1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String len=null;

    //System.out.println("--------------");
    while(!(len=br1.readLine()).equalsIgnoreCase("end")){
    System.out.println(len);
    }
    socket.close();
    }}import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class FileTransServer {
    /*
     *1 服务端先接收客户端发送的数据
     *2服务端把接收的数据保存到硬盘中 
     * */
    public static void main(String[] args) throws IOException {
    //创建服务端对象
    ServerSocket ss=new ServerSocket(9999);
    //获取客户端对象
    Socket s=ss.accept();

    //获取客户端的输入流
    InputStream in=s.getInputStream();
    BufferedReader br=new BufferedReader(new InputStreamReader(in));

    //获取客户端的ip
    String ip=s.getInetAddress().getHostAddress();

    //定义一个变量
    int count=1;
    //创建服务端要保存的数据位置
    File file=new File("tempfile\\"+ip+"("+")"+count+".txt");
    while(file.exists()){
    count++;
    file=new File("tempfile\\"+ip+"("+")"+count+".txt");
    }
    FileWriter fw=new FileWriter(file);
    String line=null;
    while((line=br.readLine())!=null){
    System.out.println(line);
    fw.write(line+System.getProperty("line.separator"));
    // System.getProperty("line.separator");
    fw.flush();
    }
    fw.close();
    System.out.println("文件已经保存成功");
    //返回给客户端的数据
    OutputStream out=s.getOutputStream();
    out.write("文件保存成功\r\n".getBytes());
    //new Thread(new Task(s)).start();
    out.write("end\r\n".getBytes());
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    // s.close();
    ss.close();
    }}
      

  4.   


    你可以把Server端这些代码移除,放在Client端的循环后,让Server先退出;
      

  5.   

    while((line=br.readLine())!=null)网络流不能使用这种方法来读取数据,用这种方法会一直阻塞。