Java-TCP协议数据传输案例之文件上传

4,517次阅读
9条评论

共计 2549 个字符,预计需要花费 7 分钟才能阅读完成。

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内,另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP 层是位于 IP 层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是 IP 层不提供这样的流机制,而是提供不可靠的包交换。

正文

在上一篇 《Java-UDP 协议数据传输简单小案例》 文章使用了 UDP 协议进行数据传输展示,UDP 协议是一种不可靠的传输协议,因为再数据发送之后,我们是无法得知其是否安全完整到达的。

TCP 协议文章开头已经介绍了,是一种可靠的基于字节流的传输层通信协议,可靠之处在哪里呢?具体请详见TCP(传输控制协议),另外 HTTP 协议就是一个很好的例子。

发送端

import java.io.*;
import java.net.Socket;

public class ClientDemo2 {public static void main(String[] args) {
        String path = "F:"+ File.separator+"test"+ File.separator+"1.jpg";
        File file = new File(path);
        try {Socket socket = new Socket("127.0.0.1",5555);
            OutputStream out  = socket.getOutputStream();
            InputStream in = new FileInputStream(file);
            int len = 0;
            byte[] b = new byte[200];
            while ((len = in.read(b))!=-1){out.write(b,0,len);
            }
            in.close();
            out.close();
            socket.close();} catch (IOException e) {e.printStackTrace();
        }

    }
}

服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ServerDemo2 {public static void main(String[] args) {
        try {ServerSocket serverSocket = new ServerSocket(5555);
            while(true){Socket socket = serverSocket.accept();
                new Thread(new Save(socket)).start();}

        } catch (IOException e) {e.printStackTrace();
        }

    }
}

class Save implements Runnable{
    private Socket s = null;
    public Save(Socket s) {this.s = s;}

    @Override
    public void run() {
        String path = "F:"+ File.separator+"test"+ File.separator+"serverImg"+ File.separator;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmsssss");
        File isPath = new File(path);
        if(!isPath.exists() || !isPath.isDirectory()){isPath.mkdir();
        }
        try {InputStream in = s.getInputStream();
            byte[] b = new byte[200];
            String fileName = Tools.MD5(simpleDateFormat.format(new Date()));
            String filePath = path+fileName+".jpg";
            OutputStream out = new FileOutputStream(filePath);
            int len = 0;
            while((len = in.read(b))!=-1){out.write(b,0,len);
            }
            out.close();
            in.close();} catch (IOException e) {e.printStackTrace();
        }
    }
}
abstract class Tools{public final static String MD5(String pwd) {char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F' };
        try {byte[] btInput = pwd.getBytes();
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            mdInst.update(btInput);
            byte[] md = mdInst.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {   //  i = 0
                byte byte0 = md[i];  //95
                str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5
                str[k++] = md5String[byte0 & 0xf];   //   F
            }
            return new String(str);

        } catch (Exception e) {return null;}
    }
}
在上方的服务器端中,为了避免文件名重复而造成文件被覆盖,采用了获取当前的时间(也可以更换成时间戳),然后再进行 MD5 加密使用 32 位密文进行命名,因为时间精确到了毫秒,一般都不会出现重名的现象。
正文完
使用官方微信小程序体验更多功能
post-qrcode
 4
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 2016-10-26发表,共计2549字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(9条评论)
英语论文代写 评论达人 LV.1
2017-01-23 20:48:55 回复

感谢楼主的分享

 Windows  Firefox  伊朗
Koolight 评论达人 LV.3
2016-11-09 09:24:23 回复

技术流文章,看不懂了啊!

 Windows  Chrome  中国湖北省武汉市电信
ewewq 评论达人 LV.1
2016-10-29 14:28:34 回复

虽然完全看不懂,但必须得支持!

 Windows  Chrome  中国甘肃省兰州市联通
澳门银座 评论达人 LV.1
2016-10-27 23:11:37 回复

顶顶顶顶顶顶顶顶顶顶 非常不错 http://www.aomenyinzuo.cn

 Windows  Chrome  中国安徽省淮北市电信
小萝博客 评论达人 LV.2
2016-10-27 07:59:29 回复

很久没来露脸了

 Windows  Chrome  中国广东省珠海市电信