Java Socket实现文件传输

article/2025/10/15 1:42:09

阿里云双11服务器优惠(年度最佳优惠):
A:1核2GB 1M 服务器年69元
B:1核2GB 1M 服务器三年180元
C:2核4GB 1~10M 服务器三年567元(强烈推荐)
D:4核8GB 1~10M 服务器三年1038元
以上均需新人才可以参加,同时还有企业专享服务器年2575元。
[活动地址:https://tb.am/hieqf]

 

最近学Socket学上瘾了,就写了一个简单的文件传输程序。

客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端。传输的进度打印到控制台中,直到传输完成。

服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名。
下面是客户端和服务端的代码实现:

客户端代码:

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;/*** 文件传输Client端<br>* 功能说明:** @author 大智若愚的小懂* @Date 2016年09月01日* @version 1.0*/
public class FileTransferClient extends Socket {private static final String SERVER_IP = "127.0.0.1"; // 服务端IPprivate static final int SERVER_PORT = 8899; // 服务端端口private Socket client;private FileInputStream fis;private DataOutputStream dos;/*** 构造函数<br/>* 与服务器建立连接* @throws Exception*/public FileTransferClient() throws Exception {super(SERVER_IP, SERVER_PORT);this.client = this;System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功连接服务端");}/*** 向服务端传输文件* @throws Exception*/public void sendFile() throws Exception {try {File file = new File("E:\\JDK1.6中文参考手册(JDK_API_1_6_zh_CN).CHM");if(file.exists()) {fis = new FileInputStream(file);dos = new DataOutputStream(client.getOutputStream());// 文件名和长度dos.writeUTF(file.getName());dos.flush();dos.writeLong(file.length());dos.flush();// 开始传输文件System.out.println("======== 开始传输文件 ========");byte[] bytes = new byte[1024];int length = 0;long progress = 0;while((length = fis.read(bytes, 0, bytes.length)) != -1) {dos.write(bytes, 0, length);dos.flush();progress += length;System.out.print("| " + (100*progress/file.length()) + "% |");}System.out.println();System.out.println("======== 文件传输成功 ========");}} catch (Exception e) {e.printStackTrace();} finally {if(fis != null)fis.close();if(dos != null)dos.close();client.close();}}/*** 入口* @param args*/public static void main(String[] args) {try {FileTransferClient client = new FileTransferClient(); // 启动客户端连接client.sendFile(); // 传输文件} catch (Exception e) {e.printStackTrace();}}}

服务端代码:

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.RoundingMode;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;/*** 文件传输Server端<br>* 功能说明:** @author 大智若愚的小懂* @Date 2016年09月01日* @version 1.0*/
public class FileTransferServer extends ServerSocket {private static final int SERVER_PORT = 8899; // 服务端端口private static DecimalFormat df = null;static {// 设置数字格式,保留一位有效小数df = new DecimalFormat("#0.0");df.setRoundingMode(RoundingMode.HALF_UP);df.setMinimumFractionDigits(1);df.setMaximumFractionDigits(1);}public FileTransferServer() throws Exception {super(SERVER_PORT);}/*** 使用线程处理每个客户端传输的文件* @throws Exception*/public void load() throws Exception {while (true) {// server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的Socket socket = this.accept();/*** 我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后,* 都要先跟当前的客户端通信完之后才能再处理下一个连接请求。 这在并发比较多的情况下会严重影响程序的性能,* 为此,我们可以把它改为如下这种异步处理与客户端通信的方式*/// 每接收到一个Socket就建立一个新的线程来处理它new Thread(new Task(socket)).start();}}/*** 处理客户端传输过来的文件线程类*/class Task implements Runnable {private Socket socket;private DataInputStream dis;private FileOutputStream fos;public Task(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {dis = new DataInputStream(socket.getInputStream());// 文件名和长度String fileName = dis.readUTF();long fileLength = dis.readLong();File directory = new File("D:\\FTCache");if(!directory.exists()) {directory.mkdir();}File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);fos = new FileOutputStream(file);// 开始接收文件byte[] bytes = new byte[1024];int length = 0;while((length = dis.read(bytes, 0, bytes.length)) != -1) {fos.write(bytes, 0, length);fos.flush();}System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");} catch (Exception e) {e.printStackTrace();} finally {try {if(fos != null)fos.close();if(dis != null)dis.close();socket.close();} catch (Exception e) {}}}}/*** 格式化文件大小* @param length* @return*/private String getFormatFileSize(long length) {double size = ((double) length) / (1 << 30);if(size >= 1) {return df.format(size) + "GB";}size = ((double) length) / (1 << 20);if(size >= 1) {return df.format(size) + "MB";}size = ((double) length) / (1 << 10);if(size >= 1) {return df.format(size) + "KB";}return length + "B";}/*** 入口* @param args*/public static void main(String[] args) {try {FileTransferServer server = new FileTransferServer(); // 启动服务端server.load();} catch (Exception e) {e.printStackTrace();}}
}

测试的结果(客户端):

测试的结果(服务端):


http://chatgpt.dhexx.cn/article/GmL1v6Fv.shtml

相关文章

Java Tcp(Socket、ServerSocket)

TCP所提供服务的主要特点&#xff1a; 面向连接的传输&#xff1b;端到端的通信&#xff1b;高可靠性&#xff0c;确保传输数据的正确性&#xff0c;不出现丢失或乱序&#xff1b;全双工方式传输&#xff1b;采用字节流方式&#xff0c;即以字节为单位传输字节序列&#xff1b…

【Socket】Java Socket通信(一)

前段时间在网上学习了Java Socket的应用编程。 端口 用于区分不同应用程序端口号范围065535&#xff0c;其中01023为系统所保留IP地址和端口号组成了所谓的Socket&#xff0c;Socket是网络上运行的程序之间双向通信链路的终结点&#xff0c;是TCP和UDP的基础http&#xff1a;…

java socket编程总结

java socket编程总结 说明一、TCP/IP协议模型二、获取IP相关信息InetAddressInetSocketAddressURL 三、TCP编程四、UDP编程五、关于TCP与UDP 说明 更新时间&#xff1a;2020/12/01 17:17&#xff0c;更新完基本内容 java的socket编程做一个总结&#xff0c;主要是面向Tcp和Ud…

Java Socket网络编程,你要的实验,我都有

JAVA Socket编程 目录 JAVA Socket编程多人聊天室客户端源代码服务器端源代码运行展示 邮件发送客户端运行展示 在线云笔记客户端窗口服务器端代码运行展示 多人聊天室 客户端源代码 import java.awt.BorderLayout; import java.awt.HeadlessException; import java.awt.event…

【Java高级】初探socket编程 ——JavaSocket连接与简单通信

新学期生活开始一段时间了&#xff0c;要继续学习一些新的技术&#xff08;这里指socket /doge&#xff09;&#xff0c;目标是尝试完成一个在线即时聊天的小程序&#xff08;尽量不咕&#xff09;。会更新一系列socket编程的技术文章&#xff0c;欢迎关注交流~ 那么千里之行&…

Java--Socket通信(双向,有界面)

服务端&#xff1a; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

JAVA 网络编程 Socket

网络&#xff1a;相互连接的计算机&#xff0c;带来的好处有共享资源&#xff0c;交换数据 IP地址&#xff1a;定位计算机地址 通常由网络地址主机地址组合 查看本机IP地址&#xff1a;电脑左下角输入CMD&#xff0c;回车在CMD界面输入ipconfig 127.0.0.1 测试本机网络配置 …

初识Java Socket编程

Java最初是作为网络编程语言出现的&#xff0c;其对网络提供了高度的支持&#xff0c;使得客户端和服务器的沟通变成了现实&#xff0c;而在网络编程中&#xff0c;使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。下面就让我们一起揭开Socket的神秘面纱。…

Java socket详解,看这一篇就够了

刚给大家讲解Java socket通信后&#xff0c;好多童鞋私信我&#xff0c;有好多地方不理解&#xff0c;看不明白。特抽时间整理一下&#xff0c;详细讲述Java socket通信原理和实现案例。整个过程楼主都是通过先简单明了的示例让大家了解整个基本原理&#xff0c;后慢慢接近生产…

递归下降文法C语言实验报告,递归下降分析法的简单例子的c语言实现

我们举的简单例子是 G[s]: S → a | ∧ | (T) T→T, S | S 转化为LL1文法 S →a |∧| (T) T →ST T→,ST| ε c语言代码实现 #include char scaner(char*input,int* p); void S(char*input,int* p); void T(char*input,int* p); void T1(char*input,int* p); void error(); int…

C++:编译实验之递归下降分析器

一、实验目的 1.加深对递归下降分析法一种自顶向下的语法分析方法的理解。 2.根据文法的产生式规则消除左递归&#xff0c;提取公共左因子构造出相应的递归下降分析器。 二、实验内容 根据课堂讲授的形式化算法&#xff0c;编制程序实现递归下降分析器&#xff0c;能对常见…

递归下降分析程序的设计和实现

递归下降分析程序的设计和实现 一、实验的目的和要求 1、了解语法分析的主要任务。 2、实现基本的递归下降分析器&#xff0c;能够分析任意的符号串是否为该文法所定义的合法算术表达式。二、实验环境 Windows7 Dev-C三、实验准备 先将递归下降分析程序的生成认真的学习一…

利用递归下降分析方法完成语法分析

一、 程序设计题目与说明 利用递归下降分析方法完成语法分析。 递归下降分析法是一种自顶向下的分析方法&#xff0c;文法的每个非终结符对应一个递归过程&#xff08;函数&#xff09;。分析过程就是从文法开始符出发执行一组递归过程&#xff08;函数&#xff09;&#xff…

编译原理 --- 递归下降分析器

第一部分 --- 构造递归下降分析器 1.在上面这个例子中则是子程序序A先调用子程序B&#xff0c;本程序结束完调用之后再返回来继续调用下一个符号 如果下一个符号是终结符的话那就直接进行匹配&#xff0c;不进行调用&#xff0c;匹配完后继续调用下一个符号 如果不是的话则调…

递归下降分析法实现强化计算器

一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整形,实型混合运算 2.通过递归下降分析法自行编写的语法分析和使用flex进行的词法分析的计算器.…

编译原理研究性学习专题 2——递归下降语法分析设计原理与实现

1 实验内容 完成以下描述赋值语句的 LL(1)文法的递归下降分析程序 G[S]: S→ VE E→ TE’ E’→ ATE’ | e T→ FT’ T’→ MFT’ | E F→ (E) | i A→ | - M→ * | / V→ i 设计说明&#xff1a;终结符号 i 为用户定义的简单变量&#xff0c;即标识符的定义。 2 实验要求 …

Python技法之简单递归下降Parser的实现方法

文章目录 一. 算术运算表达式求值二. 生成表达式树三、左递归和运算符优先级陷阱四. 相关包 一. 算术运算表达式求值 对于简单的算术运算表达式&#xff0c;假定我们已经用分词技术将其转化为输入的tokens流&#xff0c;如NUMNUM*NUM。 在此基础上&#xff0c;我们定义BNF规则…

编译实验 . 递归下降分析器

实验目的&#xff1a; 1.1掌握语法分析方法。 1.2掌握使用算符优先分析法。 1.3完成语法分析程序的设计和实现。 1.4程序能完成对指定语言的语法分析。 2. 递归下降分析器 在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下&#xff0c;我们就可能构造…

用c语言编译递归下降翻译器,Java实现C语言语义分析(递归下降)

说起这次的语义分析&#xff0c;不得不说的是我的重大的改变。上一次的语法分析是利用了预测分析法来实现的&#xff0c;经过多方考证&#xff0c;发现用预测分析法的语法分析器基础来实现语义分析的困难重重&#xff0c;例如在语法指导翻译的时候那个栈的变化和各种属性的传递…

递归下降分析法

介绍&#xff1a; 递归下降分析法是针对LL(1)文法的一种语法分析方法&#xff1b; 通过对文法的消除左递归&#xff0c;提取左公因子&#xff0c;对各个产生式和非终结符求first()和follow()集&#xff0c;通过first()和follow()集构造该文法的预测分析表&#xff0c;当这个预…