互联网编程之基于 TCP 的单线程文件收发程序(CS架构)

news2024/11/18 21:30:10

目录

需求

服务端实现

客户端实现

测试


需求

可试着根据java编程课所学到的java socket编程技术,尝试编写一个基于 TCP 的单线程文件收发程序,需满足:

服务端程序预先定义好需要发送的文件并等待客户端的连接。

客户端连接成功后,服务端将文件发送给客户端,客户端将文件保存到本地。

需要在同一个 TCP 连接内发送多个文件,不限制文件的类型和大小(操作系统支持的前提下)。

服务端实现

服务端Service实现

首先使用在端口6666创建一个ServerSocket类对象,使用accept方法监听6666端口的入站连接,如图12所示。

图12

创建DataOutputStream输出流对象,将文件的数量、各个文件的名字以及各个文件的大小写入输出流,如图13所示。

图13

创建BufferOutputStream输出流对象,将文件以字节流的方式发送出去,如图14所示。

图14

Java完整代码 

使用Socket建立了一个服务器,并向连接上该服务器的客户端发送特定文件夹中的文件信息和文件内容。

首先,通过创建ServerSocket对象并指定端口号6666,该服务器将在该端口上监听客户端的连接请求。

接下来,通过调用serverSocket.accept()方法,服务器将等待客户端的连接,并一旦有客户端连接上,就会返回一个表示客户端连接的Socket对象。

然后,定义了一个File对象file,指定了要发送文件的文件夹路径。

通过调用file.listFiles()方法,获取文件夹中的所有文件,并保存在一个File数组files中。

接下来,通过创建DataOutputStream对象data,并使用socket的输出流进行初始化。之后,通过data.writeInt(files.length)将文件数量写入输出流,告诉客户端接下来要传送的文件数量。

然后,通过循环遍历files数组,依次将每个文件名和文件长度写入输出流,使用data.writeUTF(files[i].getName())data.writeLong(files[i].length())完成。

接下来,创建了一个BufferedOutputStream对象output,利用socket的输出流进行初始化。然后,再次循环遍历files数组,对每一个文件创建一个BufferedInputStream对象input,读取文件的内容,并将内容通过output写入到socket的输出流中,实现文件的传输。

最后,关闭output、socket和serverSocket,释放相关资源。

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

public class Service {
    public static void main(String[] args)throws Exception {
        ServerSocket serverSocket=new ServerSocket(6666);
        Socket socket=serverSocket.accept();
        File file=new File("C:\\Users\\Yezi\\Desktop\\互联网编程\\实验1\\Service");
        File[] files=file.listFiles();
        DataOutputStream data=new DataOutputStream(socket.getOutputStream());
        data.writeInt(files.length);
        for(int i=0;i<files.length;i++){
            data.writeUTF(files[i].getName());
            data.writeLong(files[i].length());
        }
        BufferedOutputStream output=new BufferedOutputStream(socket.getOutputStream());
        for(int i=0;i<files.length;i++){
            BufferedInputStream input=new BufferedInputStream(new FileInputStream("C:\\Users\\Yezi\\Desktop\\互联网编程\\实验1\\Service\\"+files[i].getName()));
            int one=input.read();
            while(one!=-1){
                output.write(one);
                one=input.read();
            }
        }
        output.close();
        socket.close();
        serverSocket.close();
    }
}

客户端实现

客户端Client实现

首先创建套接字并将其连接到本地IP地址的6666端口,创建DataInputStream输入流对象,准备接受字节流,如图15所示。

图15

接收文件数量、各个文件的名字以及各个文件的大小,如图16所示。

图16

创建BufferInputStream输入流对象,以字节流的方法接收各个文件,并保存在本地,如图17所示。

图17

Java完整代码 

通过Socket连接到指定的服务器,并接收服务器发送过来的文件信息和文件内容,保存到本地。

首先,通过创建Socket对象并指定服务器的IP地址(InetAddress.getLocalHost())和端口号6666,客户端将连接到该地址上的服务器。

接下来,创建DataInputStream对象data,并使用socket的输入流进行初始化。然后,通过data.readInt()读取服务器发送过来的文件数量。

接着,定义了两个数组fileName和fileLength,用于保存每个文件的文件名和文件长度。

通过循环遍历文件数量fileNumber,分别从输入流中读取文件名和文件长度,并将其保存在对应的数组中,使用fileName[i]=data.readUTF()fileLength[i]=data.readLong()完成。

然后,创建了一个BufferedInputStream对象input,利用socket的输入流进行初始化。然后,再次循环遍历文件数量fileNumber,在每一轮循环中,先创建一个BufferedOutputStream对象output,使用FileOutputStream将其绑定到指定路径的文件上。

通过循环读取input中的每一个字节,并将其写入到output中,实现文件的接收和保存。

最后,关闭output、socket的输出流(通过socket.shutdownOutput())以及socket,释放相关资源。

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

public class Client {
    public static void main(String[] args)throws Exception {
        Socket socket=new Socket(InetAddress.getLocalHost(),6666);
        DataInputStream data=new DataInputStream(socket.getInputStream());
        int fileNumber=data.readInt();
        String[] fileName=new String[fileNumber];
        long[] fileLength=new long[fileNumber];
        for(int i=0;i<fileNumber;i++){
            fileName[i]=data.readUTF();
            fileLength[i]=data.readLong();
        }
        BufferedInputStream input=new BufferedInputStream(socket.getInputStream());
        for(int i=0;i<fileNumber;i++){
            BufferedOutputStream output=new BufferedOutputStream(new FileOutputStream("C:\\Users\\Yezi\\Desktop\\互联网编程\\实验1\\Client\\"+fileName[i]));
            for(long j=0;j<fileLength[i];j++){
                int one=input.read();
                output.write(one);
            }
            output.close();
        }
        socket.shutdownOutput();
        socket.close();
    }
}

测试

准备好多个文件,包括不同类型的图片、excel表格文件、ppt文件,准备发送,如图18所示。

图18

运行Service程序和Client程序,在Client文件查看测试结果,所有文件成功传送,测试成功,如图19所示。

图19

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ranger配置hive出錯:Unable to connect repository with given config for hive

ranger配置hive出錯&#xff1a;Unable to connect repository with given config for hive 我一開始我以為是我重啟了ranger-admin導致ranger有點問題&#xff0c;後面排查之後發現是我之前把hiveserver2關閉了&#xff0c;所以只需要重新開啟hiveserver2即可

开源 sysgrok — 用于分析、理解和优化系统的人工智能助手

作者&#xff1a;Sean Heelan 在这篇文章中&#xff0c;我将介绍 sysgrok&#xff0c;这是一个研究原型&#xff0c;我们正在研究大型语言模型 (LLM)&#xff08;例如 OpenAI 的 GPT 模型&#xff09;如何应用于性能优化、根本原因分析和系统工程领域的问题。 你可以在 GitHub …

一个真实的社会工程学攻击

社会工程学实例 不同于以往通过心理诱骗暗示或欺诈手段社会工程学举例&#xff0c;本次为大家介绍一种特殊的结合刑侦推理及利用技术手段实现的社会工程学实例&#xff0c;可以把它归类为特殊层面的信息收集手段——通过照片确定发拍照人所在的位置&#xff0c;这种社工手段严格…

ExtJS4 相关

2. 程序架构 2.1 目录结构 推荐下面这种目录结构(非强制&#xff0c;如果你足够懂和自信) - appname- app- namespace- Class1.js- Class2.js- ...- extjs- resources- css- images- ...- app.js- index.html appname 包含所有程序代码&#xff0c;是根目录 app 包含所有类&…

MySQL基础篇(day03,复习自用)

MySQL第三天 排序与分页内容练习 多表查询内容练习 排序与分页 内容 #第五章 排序与分页#1.排序 #如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的。 SELECT * FROM employees;#1.1基本使用 #使用 ORDER BY 对查询到的数据进行排序操作 …

JSON轻量级数据交换格式

文章目录 前言前后端数据交换格式比较JavaScript自定义对象 前言 JSON全名 &#xff1a;JavaScriptObjectNoation JSON在后端和前端中起着非常重要的作用。 在前端&#xff0c;JSON被用作一种数据格式&#xff0c;用于从服务器获取数据并将其展示在网页上&#xff1b; 前端开…

[SpringBoot]单点登录

关于单点登录 单点登录的基本实现思想&#xff1a; 当客户端提交登录请求时&#xff0c;服务器端在验证登录成功后&#xff0c;将生成此用户对应的JWT数据&#xff0c;并响应到客户端 客户端在后续的访问中&#xff0c;将自行携带JWT数据发起请求&#xff0c;通常&#xff0c…

LeetCode 2501 数组中最长的方波 Java

方法一&#xff0c;哈希表枚举 构造哈希集合&#xff0c;记录出现过的数字枚举遍历 import java.util.HashSet; import java.util.Set;class Solution {public int longestSquareStreak(int[] nums) {//构造哈希表集合&#xff0c;记录出现过的数字&#xff0c;转long型&…

kafka入门,Leader 和 Follower 故障处理细节(十四)

Leader 和 Follower 故障处理细节 LEO:每个腹部最后一个offset,leo其实就是最新的offset1 HW:所有副本中最小的LEO Follower故障处理细节 &#xff08;1&#xff09;Follower发生故障会被临时提出ISR (2) 这个期间leader和Follower积蓄接收数据 (3) 待该Follower恢复后&#…

嵌入式基础知识

1.嵌入式系统的定义 以应用为中心&#xff0c;以计算技术为基础软硬件可裁剪&#xff0c;适应系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机技术。 主要由嵌入式微控制器、外围硬件设备、嵌入式操作系统以及用户应用软件等部分分组成。 具有“嵌入式” 、“专用…

CSS 内容盒子与边框盒子

这章比较重要&#xff0c;会不断更新❗ 文章目录 &#x1f447;内容盒子开发者工具的使用border 边框padding 内边距margin 外边距盒子整体尺寸元素默认样式与CSS重置元素分类块级标记行级标记行内块标记 display样式内容溢出裁剪掉溢出部分滚动条 圆角边框 border-radius ✌边…

【MySQL数据库】MMM高可用架构

目录 一 、MMM简介1.1MMM&#xff08;Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09;1.2关于 MMM 高可用架构的说明如下 二、搭建mysql MMM架构2.1实验环境2.2搭建多主多从2.3安装配置 MySQL-MMM 一 、MMM简介 1.1MMM&#xff08;M…

【Linux系统编程】粘滞位详解

文章目录 1. 背景2. 准备问题引出 3. 粘滞位4. 思考粘滞位的存在是否是必要的谁可以删除 上一篇文章我们学习了Linux权限相关的内容&#xff0c;这篇文章&#xff0c;我们再来学习一个知识点——粘滞位。 1. 背景 那为了让大家更容易理解粘滞位的概念&#xff0c;首先我们要来…

【国产虚拟仪器】基于ZYNQ7045+V7 FPGA的多通道数据同步采集设计方案(一)

多通道数据采集设备在当前信息数字化的时代应用广泛&#xff0c;各种被测量的信息 如光线、温度、压力、湿度、位置等&#xff0c;都需要经过多通道信号采集系统的采样和 处理&#xff0c;才能被我们进一步分析利用[37]。在一些对采集速率要求较高的军事、航天、 航空、工业制造…

uniapp radio如何实现取消选中

uniapp 内置radio组件明确表示&#xff0c;不能取消选中&#xff0c;那如果要实现取消选中呢&#xff1f; 只要在外层加上label或者其他标签包裹&#xff0c;或者直接加入click事件然后加入事件控制radio的值改变即可 <label class"radio" click"changeAll&…

记录--Threejs-着色器实现一个水波纹

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 hree.js 是一个基于 WebGL 的 JavaScript 3D 库&#xff0c;用于创建和渲染 3D 图形场景。 一、 图像渲染过程 1、webGL webGL: WebGL 是一种基于 JavaScript API 的图形库&#xff0c;它允许在浏览器…

【STM32智能车】电机控制

【STM32智能车】电机控制 PWMPWM基本用法&#xff1a; 电机驱动基本控制基本状态 欢迎收看由咸鱼菌工作室出品的STM32系列教程。本篇内容主要电机控制 PWM 我们要控制电机&#xff0c;就要先了解一下PWM。 PWM(Pulse Width Modulation)控制——脉冲宽度调制技术&#xff0c;通…

全开源的 agv 小车

最近github 有 一个开源的stm32 大荷载小车&#xff0c;从pcb 到代码到cad 文件全部开源 代码在 git 小车的实物图 小车的cad 模型 小车的 abaqus 力学分析模型 pcb 图 控制板接线图 全开源小车 代码在 git

港科夜闻|香港科大(广州)与特斯联共建研究中心,打造国际领先的创新联合体...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大(广州)与特斯联共建研究中心&#xff0c;打造国际领先的创新联合体。6月27日&#xff0c;“数字世界”联合研究中心正式揭牌成立&#xff0c;这个由香港科大(广州)与特斯联共同打造的研究中心&#xff0c;旨在推…

hive中的datagrip和beeline客户端的权限问题

hive中的datagrip和beeline客户端的权限问题 使用ranger和kerberos配置了hadoop和hive&#xff0c;今天想用来测试其权限 测试xwq用户&#xff1a; 1.首先添加xwq用户权限&#xff0c;命令如下&#xff1a; useradd xwq -G hadoop echo xwq | passwd --stdin xwq echo xwq …