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

目录

需求

服务端实现

客户端实现

测试


需求

可试着根据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.hqwc.cn/news/3229.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS之平面转换

简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配合使用 概念&#xff1a;改变盒子在平面内的形态&#xff08;位移、旋转、缩放、倾斜&#xff09; 平面转换也叫 2D 转换&#xff0c;属性是 transform 平移 transform: translate(X轴移动距离, Y轴移动距…

项目中遇到的问题总结(四)

GateWay和Nginx的相同点和不同点在哪里&#xff1f; Gateway 和 Nginx 都是常见的反向代理服务器&#xff0c;它们的相同点和不同点如下&#xff1a; 相同点&#xff1a; 都可以作为反向代理服务器&#xff0c;接收来自客户端的请求并转发到后端服务器进行处理。 都支持负载均…

Android:设计模式

文章参考来源1 文章参考来源2 文章参考来源3 MVC Model 数据来源&#xff0c;管理业务数据逻辑&#xff0c;读取数据等 View 视图 Controller 单例模式&#xff0c;处理业务逻辑&#xff0c;负责改变Model和View 经典的MVC架构是 用户点击View&#xff0c;View将用户输入转…

搭建自己的 new bing网站----nginx反代(群晖,全docker版)

文章目录 1.前言&#xff1a;2. 部署过程&#xff1a;2.1.部署go-proxy-bing 项目&#xff1a;2.1.部署nginx反代&#xff1a;这两步完成实际上就可以访问了&#xff0c; 3.部署聊天服务器&#xff1a;代表链接成功&#xff01; 1.前言&#xff1a; 本篇教程全萌新向&#xff…

12-代码实战——服务器版表白墙

目录 1.版本一&#xff1a;将数据存到内存中 ①约定前后端交互接口 a.添加表白信息&#xff1a; b.查询表白列表&#xff1a; ②在webapp包下创建message-wall.html前端文件 ③在java包下创建AddMessageServlet后端类 ④在java包下创建MessageListServlet后端类 2.版本…

Python案例——采集专栏文章保存成pdf

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 wkhtmltopdf 软件 找助理邀课老师获取 模块使用: 内置模块 re >>>正则表达式 第三方模…

二重积分的解题技巧

计算方法 本节内容一般都应该先画图再思考后续内容较为直观 基本口诀是&#xff1a;后积先定限&#xff0c;限内画条线&#xff0c;先交写下限&#xff0c;后交写上限&#xff08;且下限必须小于上限&#xff09; 结合下图进行解释&#xff0c;后积先定限&#xff0c;对于X-型来…

VMIC-pci-5565反射内存的优势

优势&#xff1a; &#xff08;1&#xff09;实现远程互连的能力 随着仿真实验复杂度的提高&#xff0c;需要多楼宇多试验室间设备的远程互连&#xff0c;通过单模光纤及光纤HUB将远距离的试验室设备进行连接&#xff0c;单模光纤支持的传输距离可达20km。对于距离300m以内的试…

循坏队列CircularQueue

前言 一、CircularQueue 二、特点 三、设计思路 1&#xff09;判空与判满 2&#xff09;链表还是数组实现&#xff1f; 四、实现 1).IsEmpty() 2).IsFull() 3)CircularQueueCreate创建 4&#xff09;CircularQueueEnQueue插入 5&#xff09;CircularQueueDeQueue删除 6&#xf…

C++——string容器常用操作汇总

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.string容器基本概念二.string容器常用操作✅前言及函数参数的说明一.构造和析构二.string特性操作三.字符操作四.赋值操作五.拼接操作六.交换…

亚马逊云科技积极探索多样化生态合作模式,助力实现可持续发展愿景

2023年6月26日&#xff0c;亚马逊云科技中国峰会在上海世博中心盛大开幕&#xff01;以主题“因构建 而可见”为大家拉开帷幕。当前&#xff0c;越来越多的企业客户&#xff0c;以及当地政府监管机构对企业的要求&#xff0c;都需要企业告知碳足迹&#xff0c;亚马逊云科技提供…

华为OD机试真题 JavaScript 实现【寻找峰值】【牛客练习题】

一、题目描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于&#xff1b; 2.假设 nums[-1] n…