任何一本jsp书籍中都可以找到的,而且讲的要详细的多

解决方案 »

  1.   

    不是web编程,是Java的tcp/ip通讯方面的编程!
      

  2.   

    //file:DownloadServer.javapackage tcpdownload;import java.net.*;
    import java.io.*;public class DownloadServer {  private int port;                            //监听端口
      private String downloadRoot;               //下载根目录
      private boolean stop;                       //停止服务标志  public DownloadServer(int port,String downloadRoot) throws Exception{
        //只允许使用大于1023的非保留端口号,若使用了保留端口号,则抛出异常
        if (port>=1024) this.port = port;
    else throw new Exception("请使用大于1023的端口号。");
    File file = new File(downloadRoot);
    //若提供的目录存在,且确实是一个目录,则将该目录设为下载根目录,否则抛出异常
    if ((file.exists())&&(file.isDirectory())){
    //若提供的目录名最后一个字符不是"\",则在最后添加"\"字符,以便稍后生成完整文件路径
    String temp = downloadRoot.substring(downloadRoot.length()-1,
    downloadRoot.length());
    if (!temp.equals("\\")) downloadRoot += "\\";
    this.downloadRoot = downloadRoot;     //将提供的目录设为下载根目录
    }
        else throw new Exception("不存在目录"+downloadRoot);
        stop = false;                               //停止服务标志初始化为false
      }//检查文件是否真实存在,核对下载密码,若文件不存在或密码错误,则返回-1,否则返回文件长度
    //此处只要密码不为空就认为是正确的
      private long getFileLength(String fileName,String password){
        //若文件名或密码为null,则返回-1
    if ((fileName==null)||(password==null)) return -1;
    //若文件名或密码长度为0,则返回-1
        if ((fileName.length()==0)||(password.length()==0)) return -1;
        String filePath = downloadRoot + fileName;      //生成完整文件路径
    File file = new File(filePath);
    //若文件不存在,则返回-1
        if (!file.exists()) return -1;
        return file.length();                               //返回文件长度
      }  //用指定输出流发送指定文件
      private void sendFile(DataOutputStream out,String fileName) throws Exception{
        String filePath = downloadRoot + fileName;     //生成完整文件路径
        //创建与该文件关联的文件输入流
    FileInputStream in = new FileInputStream(filePath);
        byte[] buf = new byte[8192];
    int len;
    //反复读取该文件中的内容,直到读到的长度为-1
        while((len=in.read(buf))>=0){
          out.write(buf,0,len);        //将读到的数据,按读到的长度写入输出流
          out.flush();
        }
        out.close();
        in.close();
      }//提供下载服务
      public void download() throws IOException{
    System.out.println("下载服务器启动...");
    //创建监听端口port的ServerSocket对象
    ServerSocket server = new ServerSocket(port);
    //始终提供下载服务,直到stop为true
        while(!stop){
          System.out.println("等待下载请求...");
    Socket socket = server.accept();               //等待请求并建立连接
    //获取socket的输入流并包装成BufferedReader
          BufferedReader in = new BufferedReader(
                                new InputStreamReader(socket.getInputStream()));
          //获取socket的输出流并包装成DataOutputStream
    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
          try{
            String parameterString = in.readLine();    //接收下载请求参数
    //下载请求参数字符串为自定义的格式,由下载文件相对于下载根目录的路径和
    //下载密码组成,两者间以字符"@"分隔,此处按"@"分割下载请求参数字符串
            String[] parameter = parameterString.split("@");
            String fileName = parameter[0];             //获取相对文件路径
            String password = parameter[1];             //获取下载密码
    //打印请求下载相关信息
            System.out.print(socket.getInetAddress().getHostAddress()
    +"提出下载请求,");
            System.out.print("请求下载文件"+fileName+":");
    //检查文件是否真实存在,核对下载密码,获取文件长度
            long len = getFileLength(fileName,password);
            out.writeLong(len);                           //向客户端返回文件大小
            out.flush();
            //若获取的文件长度大于等于0,则允许下载,否则拒绝下载
    if (len >= 0){
              System.out.println("允许下载");
              System.out.println("正在下载文件"+fileName+"...");
              sendFile(out,fileName);                    //向客户端发送文件
              System.out.println("下载完毕");
            }
            else {
              System.out.println("下载文件不存在或密码错误,拒绝下载!");
            }
          }
          catch(Exception e){
            System.out.println(e.toString());
          }
          finally{
            socket.close();                               //关闭socket
          }
        }  //end while
        System.out.println("文件下载服务器已关闭.");
      }  public static void main(String[] args) {
    try{
    //包装标准输入为BufferedReader
          BufferedReader systemIn = new BufferedReader(
                                      new InputStreamReader(System.in));
    String root = "C:\\";                          //下载根目录初始化为C盘根目录
          while(true){
            System.out.print("请输入下载服务器的下载根目录:");
            root = systemIn.readLine().trim();        //从标准输入读取下载根目录
            File file = new File(root);
    //若该目录确实存在且为目录,则跳出循环
            if ((file.exists()) && (file.isDirectory())) break; 
    //否则打印目录无效信息
            System.out.println("目录"+root+"无效,请重新输入!");
    }
    //创建DownloadServer对象,采用8021端口
          DownloadServer server = new DownloadServer(8021, root);
          server.download();                             //启动下载服务
        }
        catch(Exception e){
          System.out.println(e.toString());
        }
      }}
      

  3.   

    //file:DownloadClientpackage tcpdownload;import java.net.*;
    import java.io.*;public class DownloadClient {  private Socket socket;                           //客户端socket  public DownloadClient(String host,int port) throws Exception{
        //初始化socket,连接指定地址和指定端口号
    socket = new Socket(host,port);
      }//向服务器提出下载请求,返回下载文件的大小
      private long request(String fileName,String password) throws IOException{
        //获取socket的输入流并包装成DataInputStream
    DataInputStream in = new DataInputStream(socket.getInputStream());
    //获取socket的输出流并包装成PrintWriter
        PrintWriter out = new PrintWriter(
                            new OutputStreamWriter(socket.getOutputStream()));
    //生成下载请求字符串
        String requestString = fileName + "@" + password;
        out.println(requestString);                     //发出下载请求
        out.flush();
        return in.readLong();                            //接收并返回下载文件长度
      }//接收并保存文件
      private void receiveFile(String localFile) throws Exception{
    //获取socket的输入流并包装成BufferedInputStream
    BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
    //获取与指定本地文件关联的文件输出流
        FileOutputStream out = new FileOutputStream(localFile);
        byte[] buf = new byte[8192];
    int len;
    //反复读取该文件中的内容,直到读到的长度为-1
        while((len=in.read(buf))>=0){
          out.write(buf,0,len);            //将读到的数据,按读到的长度写入输出流
          out.flush();
        }
        out.close();
        in.close();
      }//从服务器下载文件
      public void download() throws Exception{
    try{
    //将标准输入包装成BufferedReader
          BufferedReader systemIn = new BufferedReader(
                                           new InputStreamReader(System.in));
          System.out.print("请输入下载密码:");
          String password = systemIn.readLine();     //从标准输入读取下载密码
          System.out.print("请输入要下载的文件路径:");
          String downloadFile = systemIn.readLine();//从标准输入读取下载文件名
          System.out.print("保存至本地文件:");
    String localFile = systemIn.readLine();   //从标准输入读取本地文件名
    //向服务器提出下载请求,并获取下载文件长度
    long fileLength = request(downloadFile,password);
    //若获取的文件长度大于等于0,说明允许下载,否则说明拒绝下载
          if(fileLength>=0){
            System.out.println("下载文件大小:"+fileLength+" B");
            System.out.println("正在下载...");
            receiveFile(localFile);             //从服务器接收文件并保存至本地文件
            System.out.println("文件"+downloadFile+"已下载至本地"+localFile);
          }
          else{
            System.out.println("下载文件"+downloadFile+"不存在或下载密码错误!");
          }
        }
        catch(IOException e){
          System.out.println(e.toString());
        }
        finally{
          socket.close();                                   //关闭socket
        }
      }  public static void main(String[] args) {
    try{
    //创建DownloadClient对象,连接本机上的服务器
          DownloadClient client = new DownloadClient("127.0.0.1", 8021);
          client.download();                               //启动客户端下载程序
        }
        catch(Exception e){
          System.out.println(e.toString());
        }
      }}