Java网络编程之带文件名的文件传输(服务器+客户端)

2023-11-15

文章总览

作者的话

最近做的某个项目涉及到这方面的内容,因有感写下这篇学习记录。
希望能给和我一样正在学习java的朋友们起到帮助!

需求分析

客户端:需要向服务器发送一个文件(这里暂定图片),同时将文件名也发送过去,每次运行只发送一张图片,且发送完毕后结束运行。
服务器:需要接受文件并按指定的文件名、文件格式将文件存储在本地,服务器一经启动不再关闭,需要处于一直随时接受文件的状态。
运用到的技术:java网络编程,多线程

客户端代码

客户端代码实现

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.net.Socket;
 
public class TcpClient {
	public static void uploadPic(String path,String filename){	//filename为文件名,上传到服务器建议文件名采用时间加随机字符的格式
		try{
			Socket socket = new Socket("127.0.0.1",2835);				
			OutputStream outputStream = socket.getOutputStream();		//创建输出流对象
			DataOutputStream out = new DataOutputStream(outputStream);	// 用于输出文件名
			File file = new File(path);
			FileInputStream inputStream = new FileInputStream(file);
		
			out.writeUTF(filename);				//将文件名发送给服务器
	
			int len = 0;
			byte[] temp = new byte[1024];
			while((len = inputStream.read(temp))!=-1){
            outputStream.write(temp,0,len);
			}
			
			out.close();	//发送完毕后关闭输出流。
			outputStream.close();	
		}catch(Exception e){
			e.printStackTrace(System.out);
		}
	}

	public static void main(String []args){
		uploadPic("G:\\java\\项目\\23.花茶线上\\图片发送\\目标1.png","文件名");
	}
}

服务器端代码

服务器端代码实现

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
 
public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(2835);		//服务器端口号
	
		while(true){
			Socket accept = serverSocket.accept();				//在此处阻塞,只有当有文件发送过来时才执行后面的操作

			DataInputStream in = new DataInputStream(accept.getInputStream());
			String filename = in.readUTF();						//读取客户端发送过来的文件名

			ExecutorService exec = Executors.newCachedThreadPool();	//创建一个执行器对象来为我们管理Thread对象
			exec.execute(new Thread(new ServerThread(accept,"G:/ServerLibray/"+filename+".jpg"))); //启动任务
		}
    }
}

服务器线程定义

服务器线程的实现

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class  ServerThread implements Runnable{
	Socket sc;				
	String filename;
	public ServerThread(Socket sc1,String name){	//初始化
		sc = sc1;
		filename = name;
	}

	public void run(){
		try{
			OutputStream outputStream = new FileOutputStream(filename);		//创建指定文件的输出流对象
			InputStream inputStream = sc.getInputStream();					//获取socket对象的输入流
			int len = 0;
			byte[] temp = new byte[1024];									//每次写入1024个字节
			while((len=inputStream.read(temp))!=-1){						//若已读完输入流中的所有数据,则输入流长度为-1
				outputStream.write(temp,0,len);						//往指定文件中写入
			}	
			outputStream.close();					//单个文件传送完毕后关闭输出流
		}catch(Exception e){
			e.printStackTrace(System.out);
		}
	}
}

结语

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java网络编程之带文件名的文件传输(服务器+客户端) 的相关文章

  • 将特定项目移至列表末尾

    我有一个ArrayList in Java deleteItem createitem exportitem deleteItems createItems 我想移动包含的所有字符串delete到列表的末尾 所以我会得到下一个 create
  • OpenJDK 11 问题 - 客户端在上次 UNWRAP 之前完成握手

    我正在将代码库从 Oracle Java 1 8 0 131 迁移到 OpenJDK 11 0 1 我们有实现 nio ssl 套接字通道的代码 在 Java 8 中 客户端 服务器握手工作正常 在 Java 11 中 客户端在解包来自服务
  • spring-data-neo4j 基本一对多关系不持久

    EDIT 示例项目可在github https github com troig neo4jCustomRepository 我在后端项目中使用 Neo4J Rest 图形数据库 托管在 grapheneDb 中 和 Spring Data
  • 无法解析 Java 中的方法

    我有一个Question具有 4 个的对象Answer里面的物体 在 Question java 我有一个方法是 public Answer getA return a 在另一种方法中我有 if questions get randomNu
  • Java ASN.1 编译器

    现在我正在使用二进制笔记 http bnotes sourceforge net 解析 ASN 1 文件以在 Java 项目中使用 它采用 ASN 1 定义并生成 Java 类 让我可以操作 ASN 1 文件 我用扩展标记碰壁了 因为它不支
  • 将 hyperjaxb3 升级到 jpa 2.1

    我正在尝试在使用 maven jpa hibernate 和 hyperjaxb 的 eclipse 项目中升级到 JPA 2 1 当我尝试执行以下操作时出现以下错误Run As Run on Server从日食内部 java lang N
  • Java中单击和双击的区别

    我搜索论坛并看到以下代码 public void mouseClicked MouseEvent e if e getClickCount 2 System out println and it s a double click wasDo
  • Tomcat:Java 静态变量作用域、应用程序范围还是会话范围?

    java 静态变量是否在使用相同 web 应用程序的所有会话之间共享 或者每个会话都有自己的静态变量版本吗 换句话说 Tomcat 是为每个会话创建一组新的类 还是为整个 Web 应用程序创建一组新的类 Tomcat 创建一个ClassLo
  • 给定一个 IP 地址列表,如何找到最小值、最大值?

    在Java中 我有一个ip地址的数组列表 我如何找到最小值和最大值 我已经使用了 Collection min 但在以下情况下它不起作用 192 168 0 1 lt min 192 168 0 250 192 168 0 9 lt max
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向

    我不明白为什么JavaHttpURLConnection不遵循从 HTTP 到 HTTPS URL 的 HTTP 重定向 我使用以下代码来获取页面https httpstat us https httpstat us import java
  • “传输协议线程失败” – “套接字为 EOF”,使用 Java 进行 J2SSH 连接

    我正在尝试通过我的 Java 代码建立 SSH 连接 但遇到异常 我通过 Putty Winscp 工具测试了我的连接 它工作正常 问题出在我的 Java 代码上 SEVERE The Transport Protocol thread f
  • 我可以直接在 Maven 中使用 GitHub 项目吗?

    我有兴趣使用GitHub 上的项目 https github com toelen spymemcached jcache作为我的项目中的依赖项 GitHub 项目有一个pom文件 我可以修改我的pom文件来使用这个项目 如果是这样 怎么办
  • 如何在 jax-ws 客户端中隐藏(可能)由 jax-ws 库引起的警告

    我正在使用 netbeans 在我的应用程序中生成 Web 服务客户端 我的程序使用 jax ws 库来设置调用 Web 服务的超时 出现问题是因为每当我启动这个程序时它都会生成很多这样的警告消息 2010 年 12 月 13 日下午 4
  • Jersey/JAX-RS:如何自动使用@Valid递归级联bean验证?

    我正在 Jersey 的 REST 资源端点中验证我的 POJO public class Resource POST public Response post NotNull Valid final POJO pojo public cl
  • 了解 Etc/GMT 时区

    Apple 在从 App Store 返回自动续订订阅收据时使用 Etc GMT 时区的理由是什么 Etc GMT 时区到底是什么 Java SDK 能理解这个时区吗 或者我是否必须使用其他第三方库 例如乔达时间 http www joda
  • Java基于参数的同步(名为互斥锁/锁)

    我正在寻找一种根据接收到的参数来同步方法的方法 如下所示 public synchronized void doSomething name some code 我想要方法doSomething同步基于name参数如下 线程 1 doSom
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一
  • 根据另一个列表的顺序对列表进行排序[重复]

    这个问题在这里已经有答案了 我需要对列表进行排序Person对象 List
  • Java 和 SQL Server 中的精度噩梦

    我一直在与 Java 和 SQL Server 中的精确噩梦作斗争 直到我不再知道了 就我个人而言 我理解这个问题及其根本原因 但向地球另一端的客户解释这一点是不可行的 至少对我来说 情况是这样的 我在 SQL Server 中有两列 Qt

随机推荐

  • Python中PyEcharts库安装报错的解决办法

    如果安装pyecharts后 进行导包操作 如from pyecharts import Line 报错 出现类似connot import name Line 问题 那么下面给出了解决办法 方法一 通过查看包安装位置发现 在pyechar
  • 解决关闭hbase时stop-hbase.sh报错stopping hbasecat: /tmp/hbase-xxxx-master.pid: No such file or directory

    完整报错是 stopping hbasecat tmp hbase xxxx master pid No such file or directory 解决方法 sudo mkdir p var hadoop pids 然后进入hbase的
  • 利用wireshark对TCP抓包分析

    抓包结果已上传可免费下载对应观看 wireshark抓包结果 一 流程梳理 我的机子192 168 1 131简称A与服务端机子223 166 138 30简称B先三次握手建立TCP连接 再进行HTTP请求 最后四次挥手断开TCP连接 1
  • 如何使用QT?步骤详解

    1 首先第一步 电脑上安装qt软件 我这里安装的是qt5 5中文版本的 2 打开qt 点击左上角欢迎图标 或者也可选择文件栏目创建一个新的工程目录 3 选择New Project 如果你要使用QT来写代码c或者c 都可以选择 非QT项目栏
  • 解决Unity鼠标坐标点转成世界坐标系坐标点

    第一种 这是一种发射线 获取当前点击的物体 具有碰撞器 的坐标点 也就是碰撞器范围的坐标点 if Input GetMouseButtonDown 0 RaycastHit hitt new RaycastHit Ray ray Camer
  • c++中 string与string.h 的作用、区别和C++头文件的现状

    示例1 include
  • 根据经纬度求两点间距离实现源码(C#)-非常精确

    从Google Map上弄来的根据经纬度求地球表面两点间距离的实现 稍微改编了一下 对于我国境内空间距离计算 该实现已经够用 以米为单位 Net2 0 C 实现 public static double DistanceOfTwoPoint
  • KALI安装Pycharm

    由于直接在KALI中下载Pycharm速度往往不太理想 所以可以在本机内提前安装 再传输进KALI Pycharm下载地址 Download PyCharm Python IDE for Professional Developers by
  • 怎么样利用栅格数据分类后的结果以行政区域统计各个地类的面积

    怎么样利用栅格数据分类后的结果以行政区域统计各个地类的面积 通常在土地利用调查工作中 基于一张已经分类好的栅格数据 遥感图像数据 政府部门有需求去统计一个县或者一个乡的各类型土地的面积 如下图所示 不同的颜色代表不同的土地类型 一般 行政区
  • Python编程从入门到实践(四)-if语句

    1 一个简单示例 假设你有一个汽车列表 并想将其中每辆汽车的名称打印出来 对于大多数汽车 都应以首字母大写的方式打印其名称 但对于汽车名 bmw 应以全大写的方式打印 下面的代码遍历一个列表 并以首字母大写的方式打印其中的汽车名 但对于汽车
  • Unity3D之触摸输入单击与双击研究

    新建一个plane物体 tag设为Terrain 新建一个Cube物体 添加Rigidbody组件 tag设为Player 创建一个脚本TouchTest02 将该脚本挂到Cube物体上 本示例实现如下效果 当单击触摸屏时Cube移动到指定
  • Elasticsearch 笔记

    文章目录 Elasticsearch 基础 Lucene 简介 Elasticsearch 是什么 Elasticsearch 用途用例 Elasticsearch 的工作原理 Elasticsearch 索引 Elasticsearch
  • 3d游戏编程与设计

    目录 1 简答题 解释游戏对象 object 和资源 asset 的区别和联系 下载几个游戏案例 分别总结资源 对象组织的结构 指资源的目录组织结构与游戏对象树的层次结构 编写一个代码 使用 debug 语句来验证 MonoBehaviou
  • PYTHON执行DOS命令乱码的问题和解决

    今天想查询一个网站 某些小网站的命名是几个字母 数字 于是想起来了DOS的ping命令 查询字母值 python执行ping命令非常简单 import os os system ping XXXXX 然后很简答 乱码了 由于system只有
  • Python 算数运算符

    视频版教程 Python3零基础7天入门实战视频教程 Python支持所有的基本算术运算符 这些算术运算符用于执行基本的数学运算 如加 减 乘 除和求余等 下面是7个基本的算术运算符 以下 假设变量a为10 变量b为21 实例代码 定义变量
  • 安装vuecli3.0.3指定版本_CASTEP 19.1 linux学术版本安装教程

    1 CASTEP学术免费版本申请 CASTEP Cambridge Sequential Total Energy Package 的缩写 是一个基于密度泛函方法的从头算量子力学程序 典型的应用包括表面化学 键结构 态密度和光学性质等研究
  • 新手学Python开发的三大注意事项

    相信有不少刚刚开始学习Python的吧 前期可能繁琐的代码会让你想放弃这门技术 小编在此给大家列一个顺序 希望能够很好的帮助你坚持下去哦 1 学习目标 2 整体认知 3 学习路线 新手学Python开发的三大注意事项 学习要有目标这样在学习
  • 基础算法:整数二分——数的范围

    题目 给定一个按照升序排列的长度为 n 的整数数组 以及 q 个查询 对于每个查询 返回一个元素 k 的起始位置和终止位置 位置从 0 开始计数 如果数组中不存在该元素 则返回 1 1 输入格式 第一行包含整数 n 和 q 表示数组长度和询
  • 2021年Vue最常见的面试题以及答案(面试必过)

    Vue常见面试题 Vue的优点 说说你对SPA单页面的理解 它的优缺点分别是什么 SPA首屏加载速度慢的怎么解决 Vue初始化过程中 new Vue options 都做了什么 对MVVM的理解 Vue数据双向绑定原理 Vue的响应式原理
  • Java网络编程之带文件名的文件传输(服务器+客户端)

    Java网络编程之带文件名的文件传输 文章总览 作者的话 需求分析 客户端代码 服务器端代码 服务器线程定义 结语 文章总览 作者的话 最近做的某个项目涉及到这方面的内容 因有感写下这篇学习记录 希望能给和我一样正在学习java的朋友们起到