java网络编程怎样实现文件传输?

该博客讨论了如何设计一个简单的Java网络文件传输协议,包括文件名、大小和内容的传输步骤。建议了一种变长报文格式,并提到了在TCP长连接中为保证文件安全性和正确性,应先加密文件信息。还提及了多线程在文件传输中的应用,并推荐使用Netty框架来简化复杂交互的编程模式。提供了服务端和客户端的简单Demo。
摘要由CSDN通过智能技术生成

设计一个简单的文件传输程序,服务器接受文件,客户端发送文件,设计一个简单的文件传输协议,比如,先传输文件名,再传输文件大小,再传输文件内容。

设计不合理。
一个文件信息,不需要分成几个包来来回回请求应答。
协议格式类似如下:
8位数据包总长+3位文件名长度+文件名+ 8位文件内容长度+文件内容
以上为变长报文格式,举例如下:
00001048+008+test.txt+00001024+文件内容

要么像2L所定义的协议那样发送,简单
要么就像你期望的那样,定义协议位 数据长度(固定长度)+数据类型(固定长度)+数据
第一次传文件名 比如8位长度(String.format("%08d", filename.getBytes().length).getByes())+数据类型("01".getBytes())+数据(filename.getBytes())
第二次传文件大小 8位长度+数据类型("02")+file.getLength()
第三次以后 8位长度+数据类型("03")+file.read(buf) //最后要check和第二次传送的文件长度一致

如果是基于tcp的长连接进行传输,最好先把文件名、文件大小等文件信息进行加密传输,然后再传输实际的文件流,这样接收方可以先解密文件报文,再取根据报文内容来解析文件流。这样一是可以保证文件安全,排除非法文件传输,二是可以让接收方有据可依。

怎么用多线程完成这个任务啊

这个问题,相当于一个问题终结者。资源代下载99dxz

楼主的协议太墨迹了,我写了一个简单的demo,和楼主共同探讨一下。
我觉得没有必要多次交互,服务端只需要被动的接受就好了。
如果需要交互行为的话,服务端和客户端的编程模式就会复杂一些,建议使用netty进行开发。

这个是服务端的demo,接收一个文件。

package houlei.net.tcp;

 

 

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.nio.charset.Charset;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.LinkedList;

 

public class FileServer {

 

    private final File tmpPath;

    private final File targetPath;

    private final int port;

    private final LinkedList<Worker> workers = new LinkedList<Worker>();

    private ServerSocket serverSocket;

    private class Worker extends Thread {

        private final Socket socket;

 

        private Worker(Socket socket) {

            this.socket = socket;

        }

 

        public void run(){

            try {

                InputStream is = socket.getInputStream();

                byte[] nameLen = new byte[4];

                if (is.read(nameLen) == 4) {

                    int nameLength = (nameLen[0]&0xFF)<<24 | (nameLen[1]&0xFF)<<16 | (nameLen[2]&0xFF)<<8  | (nameLen[

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值