用Socket可以吗?
我不是要在网页中实现上传下载功能。而是有一个客户端软件和一个服务器端软件,如何实现上传下载功能?客户端软件发送要求给服务器后开始下载那样的。
大侠们能举个例子吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xhf1234】截止到2008-07-20 13:18:24的历史汇总数据(不包括此帖):
    发帖的总数量:16                       发帖的总分数:990                      每贴平均分数:61                       
    回帖的总数量:18                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:15                       结贴的总分数:890                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:100                      
    结贴的百分比:93.75 %               结分的百分比:89.90 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    值得尊敬
      

  2.   

    1.服务器端
    import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class ServerTest {
        int port = 8821;    void start() {
            Socket s = null;
            try {
                ServerSocket ss = new ServerSocket(port);
                while (true) {
                    // 选择进行传输的文件
                    String filePath = "D:\\lib.rar";
                    File fi = new File(filePath);                System.out.println("文件长度:" + (int) fi.length());                // public Socket accept() throws
                    // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。                s = ss.accept();
                    System.out.println("建立socket链接");
                    DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
                    dis.readByte();                DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
                    DataOutputStream ps = new DataOutputStream(s.getOutputStream());
                    //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
                    ps.writeUTF(fi.getName());
                    ps.flush();
                    ps.writeLong((long) fi.length());
                    ps.flush();                int bufferSize = 8192;
                    byte[] buf = new byte[bufferSize];                while (true) {
                        int read = 0;
                        if (fis != null) {
                            read = fis.read(buf);
                        }                    if (read == -1) {
                            break;
                        }
                        ps.write(buf, 0, read);
                    }
                    ps.flush();
                    // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
                    // 直到socket超时,导致数据不完整。                
                    fis.close();
                    s.close();                
                    System.out.println("文件传输完成");
                }        } catch (Exception e) {
                e.printStackTrace();
            }
        }    public static void main(String arg[]) {
            new ServerTest().start();
        }
    }
      

  3.   

    2.socket的Util辅助类
    import java.net.*;
    import java.io.*;public class ClientSocket {
        private String ip;    private int port;    private Socket socket = null;    DataOutputStream out = null;    DataInputStream getMessageStream = null;    public ClientSocket(String ip, int port) {
            this.ip = ip;
            this.port = port;
        }    /** *//**
         * 创建socket连接
         * 
         * @throws Exception
         *             exception
         */
        public void CreateConnection() throws Exception {
            try {
                socket = new Socket(ip, port);
            } catch (Exception e) {
                e.printStackTrace();
                if (socket != null)
                    socket.close();
                throw e;
            } finally {
            }
        }    public void sendMessage(String sendMessage) throws Exception {
            try {
                out = new DataOutputStream(socket.getOutputStream());
                if (sendMessage.equals("Windows")) {
                    out.writeByte(0x1);
                    out.flush();
                    return;
                }
                if (sendMessage.equals("Unix")) {
                    out.writeByte(0x2);
                    out.flush();
                    return;
                }
                if (sendMessage.equals("Linux")) {
                    out.writeByte(0x3);
                    out.flush();
                } else {
                    out.writeUTF(sendMessage);
                    out.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
                if (out != null)
                    out.close();
                throw e;
            } finally {
            }
        }    public DataInputStream getMessageStream() throws Exception {
            try {
                getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
                return getMessageStream;
            } catch (Exception e) {
                e.printStackTrace();
                if (getMessageStream != null)
                    getMessageStream.close();
                throw e;
            } finally {
            }
        }    public void shutDownConnection() {
            try {
                if (out != null)
                    out.close();
                if (getMessageStream != null)
                    getMessageStream.close();
                if (socket != null)
                    socket.close();
            } catch (Exception e) {        }
        }
    }
      

  4.   

    3.客户端
    import java.io.BufferedOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileOutputStream;public class ClientTest {
        private ClientSocket cs = null;    private String ip = "localhost";// 设置成服务器IP    private int port = 8821;    private String sendMessage = "Windwos";    public ClientTest() {
            try {
                if (createConnection()) {
                    sendMessage();
                    getMessage();
                }        } catch (Exception ex) {
                ex.printStackTrace();
            }
        }    private boolean createConnection() {
            cs = new ClientSocket(ip, port);
            try {
                cs.CreateConnection();
                System.out.print("连接服务器成功!" + "\n");
                return true;
            } catch (Exception e) {
                System.out.print("连接服务器失败!" + "\n");
                return false;
            }    }    private void sendMessage() {
            if (cs == null)
                return;
            try {
                cs.sendMessage(sendMessage);
            } catch (Exception e) {
                System.out.print("发送消息失败!" + "\n");
            }
        }    private void getMessage() {
            if (cs == null)
                return;
            DataInputStream inputStream = null;
            try {
                inputStream = cs.getMessageStream();
            } catch (Exception e) {
                System.out.print("接收消息缓存错误\n");
                return;
            }        try {
                //本地保存路径,文件名会自动从服务器端继承而来。
                String savePath = "E:\\";
                int bufferSize = 8192;
                byte[] buf = new byte[bufferSize];
                int passedlen = 0;
                long len=0;
                
                savePath += inputStream.readUTF();
                DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
                len = inputStream.readLong();
                
                System.out.println("文件的长度为:" + len + "\n");
                System.out.println("开始接收文件!" + "\n");
                        
                while (true) {
                    int read = 0;
                    if (inputStream != null) {
                        read = inputStream.read(buf);
                    }
                    passedlen += read;
                    if (read == -1) {
                        break;
                    }
                    //下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
                    System.out.println("文件接收了" +  (passedlen * 100/ len) + "%\n");
                    fileOut.write(buf, 0, read);
                }
                System.out.println("接收完成,文件存为" + savePath + "\n");            fileOut.close();
            } catch (Exception e) {
                System.out.println("接收消息错误" + "\n");
                return;
            }
        }    public static void main(String arg[]) {
            new ClientTest();
        }
    }
      

  5.   

    用jspsmartUpload这个组件SmartUpload upload = new SmartUpload();upload.upload()//上传upload.download()//下载
      

  6.   

    那个组件可以用于不再是JSP中实现上传下载的情况吗?
      

  7.   

    强人,我一般都用commons-fileupload.jar包实现
      

  8.   

    建议使用FTP协议进行传输,自己编的程序,一般功能较为单一.
    到是可以自己设计一个C/S架构的软件,但是,建议在TCP协议基础上,再封装一层协议用于多功能的实现.
      

  9.   

    难道SUN没有开发过这种上传下载的jar包吗?