JAVA 基于TCP协议的一对一,一对多文件传输实现
最近老师给我们上了多线程和TCP和UDP协议,其中一个要求就是我们用JAVA协议一个基于TCP和UDP这两种协议的一对一文件上传和一对多文件上传。
然后我就开始分析TCP和UDP这两个协议的特点,发现TCP是流传输,抓住这一点就好实现了。
现在我们需要解决一下几个问题,
1.如何确定文件名称
2.如何完成数据传输,并复原成原来的文件。
解决方案就是,对象这是个好东西,因为TCP支持流传输的缘故,我们把每个文件对象化,这样我们就很容易实现基于TCP的多文件上传了。
下面是文件对象代码:
因为我考虑到了以后移植到web端也可以用,所以我添加了源地址这一栏。
其中需要注意的就是,我们需要对文件对象进行序列化。这是一种处理对象流的机制。原理的话网上很多。
下面是TCP的配置实体类
到时候如果要放在服务器上只需要修改conAddr既可。
下面是TCPSocket端的代码
单独剥离出来的原因,主要是我希望能尽可能不让开发人员介入底层配置只需要填空即可。后面我还会对这个再一次封装。
package com.org.gjt.WebSocket.work1; import com.org.gjt.WebSocket.work1.entity.TCPsetting; import java.io.IOException;
import java.net.Socket; /**
* @author gjt
* @version 1.0
* @Title: tcpSocketClient
* @date 2018/5/24/11:10
*/
public class TcpSocketClient {
/**
* 建立socket连接
* @return
*/
public Socket ConnectTcpClient(){
Socket clientSocket = null;
/**
* 建立socket连接
*/
try {
clientSocket = new Socket(TCPsetting.conAddr,TCPsetting.port);
} catch (Exception e) {
e.printStackTrace();
}
return clientSocket;
} /**
* 关闭连接
* @param socket
*/
public void Close(Socket socket){
try {
socket.close();
System.out.println("关闭成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面是TCP协议的Client端
TCPserver端
package com.org.gjt.WebSocket.work1; import com.org.gjt.WebSocket.utils.FileUtils;
import com.org.gjt.WebSocket.work1.entity.FileSetting;
import com.org.gjt.WebSocket.work1.entity.TCPsetting; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author gjt
* @version 1.0
* @Title: 一对一上次:服务端
* @date 2018/5/24/16:55
*/
public class TCPSingleServer { /**
* 启动文件工具类
*/
private static FileUtils fileUtils = new FileUtils();
/**
* 接受传输过来的对象
*/
private static FileSetting fileSetting = new FileSetting(); private static void StartService() throws Exception {
Object obj = null;
ServerSocket serverSocket = new ServerSocket(TCPsetting.port);
System.out.println("服务器启动,等待客户端的连接。。。");
Socket socket = serverSocket.accept();
OutputStream os = null;
PrintWriter pw = null;
InputStream is = socket.getInputStream();
ObjectInputStream ois=new ObjectInputStream(is);
obj = ois.readObject();
if (obj != null){
System.out.println("接收到来自["+socket.getInetAddress().getHostAddress()+"]的文件");
fileSetting = (FileSetting) obj;
/**
* 开始存储工作
*/
File dir = new File("E:\\"+socket.getInetAddress().getHostAddress());
if(!dir.exists()){
dir.mkdir();
}
File file = new File(dir, socket.getInetAddress().getHostAddress()+fileSetting.getFileName());
/**
* 获取base64流转为指定文件
*/
String stream = fileSetting.getStream();
fileUtils.decryptByBase64(stream,file.getPath());
System.out.println("保存成功");
}
os=socket.getOutputStream();
pw=new PrintWriter(os);
pw.println("传输完成!");
pw.flush();
socket.shutdownOutput();
if(pw!=null){
pw.close();
}
if(os!=null){
os.close();
}
if(socket!=null){
socket.close();
}
} public static void main(String[] args) {
try {
StartService();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是基本代码,实现基于TCP的文件上传。
修改成一对多也很简单,之后我会把两个版本的代码上传到我的github上去,有想法的大佬可以下载下来试试。
关于修改成多文件上传,只需要在原来传输对象基础上修改成对象列表即可。
git链接:点击打开代码
这是我的微信公众号,会不定时分享学习知识。
JAVA 基于TCP协议的一对一,一对多文件传输实现的更多相关文章
- 基于Tcp协议的简单Socket通信实例(JAVA)
好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 基于TCP协议的网络通信
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java对基于TC ...
- 基于TCP协议的客户端
基于TCP协议的客户端 此客户端能用于下一篇博客的单线程服务器和多线程服务器 import java.io.BufferedReader; import java.io.IOException; im ...
- 网络编程应用:基于TCP协议【实现对象传输】--练习
要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...
- 网络编程应用:基于TCP协议【实现文件上传】--练习
要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2; import java.io.File; import java.io.FileInputS ...
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...
- 基于TCP 协议的RPC
前言: 环境: windown 10 Eclipse JDK 1.8 RPC的概念: RPC 是远程过程调用,是分布式网站的基础. 实验 SayHelloService.java 接口类,用于规范 S ...
- (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...
随机推荐
- git push 时 failed to push some refs 的解决方案
我们在利用 GIt 上传代码的时候,往往会遇到这样一个问题,导致我们的代码没有办法正常上传到仓库中 造成这个问题的原因其实很简单,就是因为远程仓库和本地库不一致. 基于这样的一个问题,解决办法自然也就 ...
- MyBatis无限级分类实现的两种方法--自关联与map集合
1.这回先创建数据库吧 下表cid是CategoryId的缩写,cname是CategoryName的缩写,pid是parentId的缩写 无限级分类一般都包含这三个属性,至少也要包含cid和pid才 ...
- paxos算法——今生
Paxos 定义2.1 票:即弱化形式的锁.它具备下面几个性质: 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放. 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最 ...
- 安装mysql apache php smb
1 SMB LinuX下SMB的配置 使用Smb进行连接的命令: smbclient //192.168.128.1/Share 今天要在LINUX之间以及LINUX与WINDOWS之间互相传送文件, ...
- docker 获取镜像
之前提到过,Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像. 从 Docker 镜像仓库获取镜像的命令是 docker pull.其命令格式为: docker p ...
- JS处理时间戳、前台拿到日期时间戳,时间戳转日期格式
今晚做分页的时候,遇到后台往前台传日期类型,会出现这种情况,好像是微软为了解决操作系统兼容性问题,将日期全部转换为从1970年1月1日至现在时间的时间戳.为了解决这个问题,特意百度了一番,整理了处理日 ...
- 分布式全局ID生成方案
传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多 ...
- .gitignore 的简单实用
a: 在工作目录下右键点击使用git命令行(GitBash) b: 输入 touch .gitignore 命令,此时会在工作目录下生成一个“.gitignore”的文本文件 注:touch在git里 ...
- 使用NLog记录业务日志到数据库
项目中很多时候要记录业务日志,其实是可以直接用日志框架计入数据库的. 使用NLog并不是只能将日志主体插入数据库,而是可以根据实际情况自定义任意列记入.非常方便.而且很容易实现 下面是用NLog记录业 ...
- 【测试-测试心得】测试发现BUG后,怎么定位问题?
一.判断前后端 Safari中可以右键,选择“检查元素”,再选择“网络”同样可以抓取到http请求,如图 怎么区分是前端错误还是后端错误? 1.在开发者工具中,如果console中有报错,则表示前端代 ...