如何把Socket作为平台 发送和接收文件

来源:不详 责任编辑:栏目编辑 发表时间:2013-07-01 09:13 点击:

这是一个简单的包含发送端和接收端的例子。发送端向接收端发送文件名和文件内容,接收端将收到的文件保存在磁盘上。接收端可以同时接收多个发送端传来的文件,但没有处理文件同名的情况。

这个例子中设计了一个简单的协议。发送的内容是这样的:

文件名长度(4字节)—文件名—文件内容长度(4字节)—文件内容。

接收端也按照这个结构进行解析。建议先看 Client 类,再看 Server 类。

view plaincopy to clipboardprint?
import java.io.*;   
import java.net.ServerSocket;   
import java.net.Socket;   
    
/**  
 * 简单的文件发送与接收示例  
 */  
public class FileTrasmission {   
    
    //程序入口   
    public static void main(String[] args) throws Exception {   
        int port = 7788;   
        new Server(port, "c:\\save\\").start();   
        new Client().sendFile("127.0.0.1", port, "c:\\迷失在康熙末年.txt");   
    }   
}   
    
/**  
 * 接收端。可同时接收多个发送端发来的文件。但如果发来的文件是同名的话那就乱了。  
 */  
class Server {   
    
    private int listenPort;   
    
    private String savePath;   
    
    /**  
     * 构造方法  
     *  
     * @param listenPort 侦听端口  
     * @param savePath   接收的文件要保存的路径  
     *  
     * @throws IOException 如果创建保存路径失败  
     */  
    Server(int listenPort, String savePath) throws IOException {   
        this.listenPort = listenPort;   
        this.savePath = savePath;   
    
        File file = new File(savePath);   
        if (!file.exists() && !file.mkdirs()) {   
            throw new IOException("无法创建文件夹 " + savePath);   
        }   
    }   
    
    // 开始侦听   
    public void start() {   
        new ListenThread().start();   
    }   
    
    // 网上抄来的,将字节转成 int。b 长度不得小于 4,且只会取前 4 位。   
    public static int b2i(byte[] b) {   
        int value = 0;   
        for (int i = 0; i < 4; i++) {   
            int shift = (4 - 1 - i) * 8;   
            value += (b[i] & 0x000000FF) << shift;   
        }   
        return value;   
    }   
    
    
    /**  
     * 侦听线程  
     */  
    private class ListenThread extends Thread {   
    
        @Override  
        public void run() {   
            try {   
                ServerSocket server = new ServerSocket(listenPort);   
    
                // 开始循环   
                while (true) {   
                    Socket socket = server.accept();   
                    new HandleThread(socket).start();   
                }   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
        }   
    }   
    
    /**  
     * 读取流并保存文件的线程  
     */  
    private class HandleThread extends Thread {   
    
        private Socket socket;   
    
        private HandleThread(Socket socket) {   
            this.socket = socket;   
        }   
    
        @Override  
        public void run() {   
            try {   
                InputStream is = socket.getInputStream();   
                readAndSave(is);   
            } catch (IOException e) {   
                e.printStackTrace();   
            } finally {   
                try {   
                    socket.close();   
                } catch (IOException e) {   
                    // nothing to do   
                }   
            }   
        }   
    
        // 从流中读取内容并保存   
        private void readAndSave(InputStream is) throws IOException {   
            String filename = getFileName(is);   
            int file_len = readInteger(is);   
            System.out.println("接收文件:" + filename + ",长度:" + file_len);   
    
            readAndSave0(is, savePath + filename, file_len);   
    
            System.out.println("文件保存成功(" + file_len + "字节)。");   
        }   
    
        private void readAndSave0(InputStream is, String path, int file_len) throws IOException {   
            FileOutputStream os = getFileOS(path);   
            readAndWrite(is, os, file_len);   
            os.close();   
        }   
    
        // 边读边写,直到读取 size 个字节   
  
	
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Java编程语言的八大优点
    • JVM对象生命周期详细介绍
    • Java平台上的CRM系统
    • Java 算数测试小程序
    • Command(命令模式)
    • Java环境 使用Resin在NT环境下配置JSP环境
    • Java 一个简单的画图程序
    • Java 日历的小程序
    • Java 统计代码的小工具
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1