服务端

package TCP;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;public class TCP_File_Server {public static void main(String[] args) throws Exception {/*** 创建服务端套接字*/ServerSocket ss = new ServerSocket();/*** 绑定指定端口*/ss.bind(new InetSocketAddress(12345));System.out.println("《《《《网盘开始运行》》》》");/*** 监听并接受客户端socket连接,并返回一个socket*//*** 持续接收客户端发来的信息,并交给线程处理*/while(true) {Socket socket = ss.accept();new Thread(new UpLoad(socket)).start();}}
}class UpLoad implements Runnable{private Socket socket = null;public UpLoad(Socket socket) {this.socket = socket;}@Overridepublic void run() {OutputStream out = null;try {// 创建文件输入流,接收客户端的socket中的文件流InputStream in = socket.getInputStream();/*** 获取文件名长度* 文件格式:文件名长度(数字)\r\文件名\r\n文件内容\r\n* 获取文件名 - 读到第一个回车换行之前 截取出文件名的长度 接着读取这个长度的字节 就是文件名* 读取数据 直到遇到第一个回车换行* 每次从流中读取一个字节 转成字符串 拼到line上 只要line还不是\r\n结尾 就重复这个过程*/String line1 = "";byte[] by1 = new byte[1];while(!line1.endsWith("\r\n")) {in.read(by1);String str = new String(by1);line1 += str;}/*** 1.读到长度,去掉\r\n就是文件名字的长度* 2.parseInt():作用是将可分析的字符串转化为整数。* 3.substring():返回一个新字符串,它是此字符串的一个子字符串。*/int len1 = Integer.parseInt(line1.substring(0, line1.length() - 2));/*** 1.读取文件名* 2.先创建一个长度和文件名长度相等的字节数组,用来存放文件名* 3.read(data):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 data 中*      data数组有多大,就在in输入流里面读取多少内容,并将内容存放在data数组里面*/byte[] data = new byte[len1];in.read(data);String fileName = new String(data);// 获取文件内容字节长度String line2 = "";byte[] by2 = new byte[1];while(!line2.endsWith("\r\n")) {in.read(by2);String str = new String(by2);line2 += str;}int len2 = Integer.parseInt(line2.substring(0, line2.length() - 2));// 创建输文件出流,指定文件输出地址String path = "E:/" + fileName;out = new FileOutputStream(path);// 获取文件内容字节// 流对接byte[] by3 = new byte[len2];in.read(by3);out.write(by3);System.out.println("接受到来自"+socket.getInetAddress().getHostAddress()+"上传的文件"+path);} catch (IOException e) {e.printStackTrace();}finally {// 关闭资源// 关闭输出流try {if(out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}finally {out = null;}// 关闭sockettry {if(socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}finally {socket = null;}}}
}

客户端

package TCP;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;public class TCP_File_Client {public static void main(String[] args) {Scanner scan = null;InputStream in = null;Socket socket = null;try {/*** 1.扫描控制台接收文件路径名*   创建一个file引用,指向一个新的File对象,并给文件赋予地址*/System.out.println("请输入要传输文件的路径:");scan = new Scanner(System.in);String path = scan.nextLine();File file = new File(path);/*** 2.判断文件是文本文件而不是文件夹并且路径存在*  exists():判断文件是否存在*  isFile():判断是不是文件 */if(file.exists() && file.isFile()) {/*** 3.创建文件输入流,发送文件 *   将文件输入的内容都放在file里面*/in = new FileInputStream(file);/*** Socket 这个类实现客户端套接字(也称为“套接字”)。套接字是两台机器间通信的端点。** 4.创建客户端套接字*/socket = new Socket();//InetSocketAddress Inets = new InetSocketAddress("127.0.0.1", 12345);/*** 5.连接TCP服务器*       确定服务端的IP和端口号*/socket.connect(new InetSocketAddress("127.0.0.1", 12345));/*** 6.获取到客户端的输出流*   OutputStream     getOutputStream()*                         返回此套接字的输出流。 */OutputStream out = socket.getOutputStream();/*** 7.向服务器发送文件*   自己定义了一个协议来解决粘包现象,获取文件名*   7.1.我们先将文件中的内容读取出来,放到file里面*   7.2.先读文件名  file.getName()*   7.3.将文件名转换成字节  file.getName().getBytes()*   7.4.获取文件名的字节的长度  file.getName().getBytes().length*   7.5.再在文件名长度的后面加上  \r\n 作为标识符*/// 向服务器发送[文件名字节长度 \r\n]out.write((file.getName().getBytes().length + "\r\n").getBytes());// 向服务器发送[文件名字节]
                out.write(file.getName().getBytes());// 向服务器发送[文件字节长度\r\n]out.write((file.length() + "\r\n").getBytes());// 向服务器发送[文件字节内容]byte[] data = new byte[1024];int i = 0;while((i = in.read(data)) != -1) {out.write(data, 0, i);}}else {System.out.println("文件不存在或者一个文件~~");}} catch (Exception e) {e.printStackTrace();}finally {/*** 关闭Scanner,文件输入流,套接字* 套接字装饰了输出流,所以不用关闭输出流*/if(scan != null) {scan.close();}try {if(in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}finally {// 强制将输入流置为空in = null;}try {if(socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}finally {// 强制释放socketsocket = null;}}System.out.println("文件传输完毕");}
}

转载于:https://www.cnblogs.com/chuijingjing/p/9550423.html

Java 简单TCP文件传输相关推荐

  1. 计算机网络实验传输文件,湖大计算机网络实验-tcp文件传输实验

    实验二 tcp文件传输 信息安全2班莫胜吕 20100830215 一,实验目的 掌握实现网络文件传输的方法,并了解TCP连接是字符流的二,实验内容 1,单线程的文件传输 2,多线程的文件传输 3,加 ...

  2. Linux下C语言实现TCP文件传输

    开发环境: Linux,GCC 功能介绍: 客户端和服务端的TCP文件传输,客户端可以上传文件到服务端,也可以从服务端下载文件,还可以查看和修改服务端的工作目录(临时),查看客户端当前目录. 代码下载 ...

  3. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  4. c 语言 验证码识别算法,一个简单的文件传输验证码识别c/s实现

    一个简单的文件传输验证码识别c/s实现 大体思路 client通过tcp向server传输一个待识别的验证图片,server端识别后通过tcp回传给client. server端识别验证码采用pyte ...

  5. Java Socket实现文件传输

    阿里云双11服务器优惠(年度最佳优惠): A:1核2GB 1M 服务器年69元 B:1核2GB 1M 服务器三年180元 C:2核4GB 1~10M 服务器三年567元(强烈推荐) D:4核8GB 1 ...

  6. python3 tcp 文件传输源码

    tcp文件传输 from socket import * s=socket() s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind(('0.0.0.0',45 ...

  7. 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...

    我有一个创建FTPS连接的CreateFTPConnection类.使用此连接传输文件.这里是TransferFile类的代码如何创建一个"FTPS"模拟服务器以单元测试Java中 ...

  8. java qq 传送文件_如何利用Java实现QQ文件传输功能.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 如何利用Java实现QQ文件传输功能.pdf2页 本文 ...

  9. QT中TCP文件传输

    QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...

  10. qt+TCP文件传输

    简述 刚开始学习qt,在学习完网络编程后,觉得还是需要总结一下,毕竟总结才能更加的深刻. 本人第一次在csdn上写博客,想监督一下自己,让自己有一个学习的动力.好了不多说了, 目录 目录 简述 一.网 ...

最新文章

  1. Python炫技操作:模块重载的五种方法
  2. 【NOIP2015】斗地主 题解
  3. lcd和服务器同时显示温度,51单片机LCD1602如何同时显示温度和时间
  4. SQL Server 自定义函数 返回树结构函数
  5. TQ210——核心板和底板
  6. shell:判断一个进程是否存在
  7. 黑色炫酷粒子动态html网站源码
  8. 通俗理解协方差与相关系数
  9. Python基础知识笔记(二)
  10. 在vue.js中如何导出Excel表格
  11. 新装的电脑执行maven install命令一直报Could not find artifact jdk.tools:jdk.tools:jar:1.7
  12. android .9图片如何引用,Android调用相机拍照并返回路径和调用系统图库选择图片...
  13. B站韩顺平java学习笔记(九)-- 面向对象编程(高级)章节
  14. NYOJ-47 过河问题
  15. 通过Akka学习指数退避(Exponential Backoff)
  16. “新基建”将改变什么
  17. 计算机制作节日贺卡教案,幼儿园节日教案:做贺卡
  18. android 杀进程推送服务,关于APP进程被杀死,极光推送收不到消息的解决办法
  19. uni-app系列(二):uniapp 项目引入 uView 并简单使用
  20. Outlook 显示Working Offline?

热门文章

  1. linux查看tongweb端口,东方通tongweb linux安装
  2. Serverless 实战:3 分钟实现文本敏感词过滤
  3. 上海蓝光集团信息安全建设方案
  4. JDBC作用接口和创建的步骤详细解析
  5. 一战零基础跨考吉大软件工程专硕上岸的一些经验分享
  6. 计算机VB圆的面积周长,使用VB设计一个简单的小程序计算圆的面积
  7. 兄弟9150cdn换硒鼓清零抹粉_兄弟打印机粉盒硒鼓怎么清零?这里有详细的步骤...
  8. 3DSMAX 中的CS 骨骼动画插件初探
  9. matlab 图像中加入高斯白噪声,matlab – 使用imnoise为图像添加高斯噪声
  10. 项目过程管理(十七)结项