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

这篇具有很好参考价值的文章主要介绍了互联网编程之基于 TCP 的单线程文件收发程序(CS架构)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

需求

服务端实现

客户端实现

测试


需求

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

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

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

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

服务端实现

服务端Service实现

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图12

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图13

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图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所示。

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图15

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图16

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图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所示。

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图18

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

互联网编程之基于 TCP 的单线程文件收发程序(CS架构),互联网编程,tcp/ip,架构,网络协议

图19文章来源地址https://www.toymoban.com/news/detail-517128.html

到了这里,关于互联网编程之基于 TCP 的单线程文件收发程序(CS架构)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从 TCP/IP 到 CCIP:Chainlink 与合约的互联网

    未来已来。通过链上金融重塑资本市场预计将影响全球价值 8.67 万亿美元的资产的使用方式。 Chainlink 的跨链互操作性协议(CCIP)将会这一转型过程中发挥重要作用,这是区块链连接性和互操作性的突破,使得 DeFi 应用可以通过单一界面访问用户,并与其他不同区块链上的

    2024年02月14日
    浏览(29)
  • 互联网基石:TCP/IP 四层模型,由浅入深直击原理!

    TCP/IP 是迄今为止最常用的网络互联协议套件,在全球互联网运营方面发挥了巨大作用,可以这样说 TCP/IP 在互联网世界无处不在! TCP/IP 最初由 DARPA(美国国防高级研究计划局)的两位科学家于 1970 年代开发,这两位科学家分为是 Vint Cerf 和 Bob Kahn,被称为 Internet 之父 。 当时

    2024年02月04日
    浏览(31)
  • 互联网编程之域名IP转换及应用URL类定位和获取数据编程

    目录 需求 域名解析程序 下载功能程序 断点续传下载 编写域名解析程序(30分): 编写一个可重用的域名解析程序模块,使之能够将用户输入的域名解析为IP地址。 编写下载功能程序(40分): 使用URL类,编写一个可重用的下载程序模块,完成HTML和图像文件的下载。即用户

    2024年02月12日
    浏览(72)
  • 互联网Java工程师面试题·Java 并发编程篇·第五弹

    目录 52、什么是线程池? 为什么要使用它? 53、怎么检测一个线程是否拥有锁? 54、你如何在 Java 中获取线程堆栈? 55、JVM 中哪个参数是用来控制线程的栈堆栈小的? 56、Thread 类中的 yield 方法有什么作用? 57、Java 中 ConcurrentHashMap 的并发度是什么? 58、Java 中 Semaphore 是什么

    2024年02月07日
    浏览(56)
  • 书栈网-BookStack 程序员IT互联网开源编程书籍免费阅读

    书栈网是一个提供各种编程语言和技术的开源书籍免费阅读的网站,涵盖前端、后端、数据库、算法、数据分析等领域。您可以在书栈网找到最新最热的开源书籍,以及相关的文档资料。 书栈网提供网页版跟手机APP。 网页版书栈网官网地址:https://www.bookstack.cn/ 手机版 Book

    2024年02月04日
    浏览(48)
  • 基于区块链技术的 工业互联网标识

    案例提供单位: 北京众享比特科技有限公司 为完善工业互联网产业生态,提高工业互联网产业能力,某通信公司省级分公司率先开展标识解析体系在电子信息产业的探索应用,打造工业互联网标识解析应用平台,并通过与国家二级节点互联互通接入整个标识解析体系。北京众

    2024年02月01日
    浏览(56)
  • UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议

    您的描述是正确的。UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议。他们之间有几个重要的区别,其中之一就是建立连接的方式。 连接方式: • TCP:在进行数据传输之前,需要通过三次握手(3-way handshake)建立连接。这可以确保

    2024年02月02日
    浏览(99)
  • 2021电赛D题:基于互联网的摄像测量系统 思路

    2021年全国电赛题目如下: 基于opencv,树莓派,以及网络交换机组成的摄像测量系统。由测量摄像 系统与网络传输系统组成。支持开机自启动,一键测量,声光提示结束测量,高帧率显 示图像的系统。其中摄像系统包括两组树莓派与摄像头组合,网络传输系统由网线,以 太

    2024年02月16日
    浏览(23)
  • 互联网加竞赛 基于机器视觉的手势检测和识别算法

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 废话不多说,先看看学长实现的效果吧 主流的手势分割方法主要分为静态手

    2024年01月20日
    浏览(32)
  • [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单进程、多进程、多线程、线程池tcp服务器

    网络的上一篇文章, 我们介绍了网络变成的一些重要的概念, 以及 UDP套接字的编程演示. 还实现了一个简单更简陋的UDP公共聊天室. [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现…

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包