计算机网络实验(15):基于Socket的网络编程(附JAVA源码.txt)

news2024/12/24 22:07:11

一、实验名称

UDP客户服务器即时通信程序

二、实验目的:

掌握基于SOCKET的网络编程方法。
基于JAVA语言,编写一个SOCKET的即时通信小程序

三、实验内容和要求

实验内容:

基于JAVA语言,编写一个SOCKET的即时通信小程序

实验平台:

Windows操作系统、Linux操作系统。

JAVA开发平台(不限)。

参考书籍:

《JAVA NETWORK PROGRAMMING》

四、实验环境

硬件环境:

cpu型号:11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz

主频内存型号:2.42 GHz

容量:32+512

软件环境:

操作系统版本号:22631.3296

软件及语言版本版本:IntelliJ IDEA Community Edition2023-JAVA-JDK17.0.5

五、程序设计结构及技术原理

1、socket概述

        socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

        socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

2、基于socket技术的TCP通信流程

1)服务端(被动连接,需创建自己的地址信息)

        创建一个套接字 ———socket()

        绑定IP地址、端口等信息到socket上——bind()

        监听套接字——listen()

        等待客户端的连接请求——accept()

        发送、接收数据——send()recv(),或者read()write()

        关闭网络连接——close()

2)客户端

        创建一个套接字——socket()

        连接服务器——connect()

        接收、发送数据——send()recv(),或者read()write()

        关闭网络连接——close()

3、基于socket技术的TCP通信流程框图

4、基于socket技术的UDP通信流程

1)服务器(Server)流程主要分为下述6个部分。

        (1)建立套接字文件描述符,使用函数socket(),生成套接字文件描述符。

        (2)设置服务器IP地址和端口,初始化要绑定的网络地址结构。

        (3)绑定IP地址、端口等信息,使用bind()函数,将套接字文件描述符和一个地址进行绑定。

        (4)循环接收客户端的数据,使用recvfrom()函数接收客户端的网络数据。

        (5)向客户端发送数据,使用sendto()函数向服务器主机发送数据。

        (6)关闭套接字,使用close()函数释放资源。UDP协议的客户端流程

2)UDP协议的客户端流程分为5个部分。

        (1)建立套接字文件描述符,socket();

        (2)设置服务器IP地址和端口,struct sockaddr;

        (3)向服务器发送数据,sendto();

        (4)接收服务器的数据,recvfrom();

        (5)关闭套接字,close()。

六、实验步骤

一、Java基于Socket的文件传输小程序原理:

文件传输通常涉及到套接字编程,这是一种在两个应用程序之间创建连接并交换数据的技术。在Java中,Socket编程主要涉及java.net.Socket和java.io包中的InputStream、OutputStream等类。基本步骤如下:

a. 服务器端(Server:
    • 创建ServerSocket监听特定端口,等待客户端连接。
    • 当客户端连接时,使用accept()方法接受连接请求,并创建一个新的Socket实例处理该连接。
    • 使用OutputStream写入文件内容到客户端,FileInputStream读取本地文件。
    • 客户端断开连接后,关闭流。
b. 客户端(Client:
    • 创建Socket连接到服务器的指定地址和端口。
    • 使用FileOutputStream从服务器接收文件,FileInputStream保存到本地。
    • 断开连接后,关闭流。
  1. 引用OutputStream和InputStream:
    • OutputStream是输出流,用于将数据发送到另一端,如向Socket发送文件内容。
    • InputStream是输入流,用于接收来自另一端的数据,如从Socket接收文件内容。 在文件传输过程中,这两个类分别代表了数据的双向流动,它们提供了读写操作,使得服务器和客户端能够进行数据交换。
  2. Server和Client类的UML类图(简化版):
    • Server类包含以下元素:
      • 属性:ServerSocket serverSocket, Socket clientSocket, File fileToTransfer
      • 方法:start(), acceptConnection(), sendFile(), closeConnection()
    • Client类包含以下元素:
      • 属性:Socket socket, File localFile, FileOutputStream outputStream, FileInputStream inputStream
      • 方法:connect(), downloadFile(), closeConnection()
  3. handClientConnection方法分析(假设这个方法在服务器端):
    • handClientConnection方法,是在服务器端处理客户端连接的处理逻辑:

二、程序类图

三、Client类(客户端)

1创建Socket连接

客户端尝试通过Socket类建立连接到服务器。

2文件操作

控制台输入的内容,使用BufferedInputStream读取字节到Server传入控制器中。

3数据传输

获取socket的输出流(OutputStream),将通信内容写入输出流,并确保数据已完全发送出去。

4关闭资源

关闭输入流、输出流和socket,释放系统资源。

5异常处理

使用try-catch块捕获可能出现的异常,打印堆栈跟踪以进行调试。

Client代码片

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket
                    ("127.22.0.0", 12345); // 连接服务器
            System.out.println("成功连接到服务器");// 输出信息到控制台
            BufferedReader input = new BufferedReader// 从服务器获取输入流
                    (new InputStreamReader(socket.getInputStream()));
            PrintWriter output = new PrintWriter// 向服务器发送消息的输出流
                    (socket.getOutputStream(), true);
            BufferedReader reader = new BufferedReader// 从控制台获取输入流
                    (new InputStreamReader(System.in));

            String message;
            while (true) {
                System.out.print("> ");// 控制台输出符号
                message = reader.readLine(); // 从控制台读取输入的消息
                output.println(message);// 发送控制台输入的消息给服务器
                if(message.equalsIgnoreCase// 如果收到"exit"消息,停止循环
                        ("exit")){
                    break;
                }
                String response = input.readLine();// 读取服务器发送的消息
                System.out.println
                        ("服务器: " + response); // 输出服务器发送的消息到控制台
            }

            input.close(); // 关闭输入流
            output.close(); // 关闭输出流
            socket.close();// 关闭套接字

        } catch (IOException e) {
            e.printStackTrace();// 捕获并打印异常信息
        }
    }
}

四、Server(服务器)

1)主分支(创建与监听)

ServerSocket serverSocket = new ServerSocket(12345);:创建一个服务器套接字,监听指定的端口(12345)等待客户端连接。

2)客户端连接处理

serverSocket.accept();:阻塞地等待客户端连接,并获取连接的Socket对象。

3)控制台交互

读取客户端输入、输出流:使用BufferedReaderPrintWriter处理输入和输出数据。

4)子分支或细节

循环读取输入消息并处理:while (true)内,不断读取客户端消息,如果等于"exit"则跳出循环。

5)监听控制台

监听控制台输入:通过System.in读取用户命令,用于构建响应。

输入“exit”退出程序;

Server代码片

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket
                    (12345); // 创建ServerSocket

            System.out.println
                    ("服务器已启动,等待连接...");// 输出信息到控制台

            Socket clientSocket = serverSocket.accept(); // 监听客户端连接
            System.out.println
                    ("客户端 " + clientSocket.getInetAddress() + " 已连接");
                    // 输出信息到控制台
            BufferedReader input = new BufferedReader// 从客户端获取输入流
                    (new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter output = new PrintWriter// 向客户端发送消息的输出流
                    (clientSocket.getOutputStream(), true);

            BufferedReader reader = new BufferedReader
                    (new InputStreamReader(System.in));// 从控制台获取输入流

            String message;
            while (true) {
                message = input.readLine();// 读取客户端发送的消息
                if (message.equalsIgnoreCase("exit")) {
                    break;// 如果收到"exit"消息,停止循环
                }
                System.out.println("客户端: " + message);// 输出客户端发送的消息到控制台
                System.out.print("> "); // 控制台输出符号
                String response = reader.readLine(); // 从控制台读取输入的消息
                output.println(response);// 发送控制台输入的消息给客户端
            }

            input.close();// 关闭输入流
            output.close();// 关闭输出流
            clientSocket.close(); // 关闭客户端套接字
            serverSocket.close(); // 关闭服务器端套接字
        } catch (IOException e) {
            e.printStackTrace();// 捕获并打印异常信息
        }
    }
}

七、操作步骤

1)运行配置:

Jdk17.0.5,IntelliJ IDEA Community Edition2023

运行文件改为当前文件

2)运行Server类(服务器类)

等待服务器启动成功 /next

3)运行Client类(客户端)

连接服务器类(Server)

        4)从客户端(Client)发送消息,即可在服务器端(Server)收到客户端(Client)的消息

 

5)服务器(Server)发送信息,客户端(Client)也能收到    

6)测试控制台监听并“exit”退出程序

Client

Server

Client:输入“exit”程序终止

八、实验代码截图(IntelliJ IDEA Community Edition2023)

Client类:

Server类:

九、实验体会、质疑和建议

实验总结:

技术选型

ServerSocket serverSocket = new ServerSocket(12345);:创建一个服务器套接字,监听指定的端口(12345)等待客户端连接。serverSocket.accept();:阻塞地等待客户端连接,并获取连接的Socket对象NIO(非阻塞I/O)或通道(Channels)机制有助于提高性能。

程序结构

Server

ServerSocket serverSocket = new ServerSocket
 (
12345); // 创建ServerSocket

Client

Socket socket = new Socket
 (
"127.0.0.1", 12345); // 连接服务器

通常包括服务器端(Server)接收客户端请求,创建Socket连接,读取信息并发送到客户端;客户端(Client)则连接服务器

文件传输

BufferedReader input = new BufferedReader// 从客户端获取输入流
        (new InputStreamReader(clientSocket.getInputStream()));
PrintWriter output = new PrintWriter// 向客户端发送消息的输出流
        (clientSocket.getOutputStream(), true);

通过字节流(InputStream/OutputStream)进行逐字节的数据传输

错误处理

catch (IOException e) {
   
e.printStackTrace();// 捕获并打印异常信息
}

确保捕获并处理可能出现的异常,如网络中断、信息不存在等,并提供适当的错误反馈。

心得体会

学习了SocketServerSocket的使用,知道如何创建和管理客户端和服务器套接字,以及如何通过它们进行双向通信;学会了如何使用Java的输入输出流来在网络连接上发送和接收数据。这包括使用BufferedReaderPrintWriter来简化字符流的读取和写入操作。

在网络编程中,可能会发生各种类型的异常,比如网络连接问题、IO异常等,学会如何捕获和处理这些异常非常重要;如果在服务器端需要同时处理多个客户端,可能需要使用多线程来实现并发通信,从而保证各个客户端的服务质量。设计通信协议是必要的,可以使用一些简单的协议来定义消息格式和通信规则,以便客户端和服务器能够正确地解析和处理消息。在真实的应用中,安全性是至关重要的,比如考虑到加密通信、身份验证等安全问题。

总的来说,基于Socket的即时通信小程序是一个很好的项目,可以让了解到Java网络编程的基本原理并且提升实际动手能力。当然,实际生产环境中的网络应用可能更加复杂,但这样的小程序能为打下一定的基础。

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

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

相关文章

手把手教你构建和使用Redis Cluster去中心化集群

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时,就可以采用Cluster架构达到负载均衡目的。官方文档:Scale with Redis Cluster | Docs 1.为什么要用redis-cluster集群? 1.首先Redis单实例主要有单点,容量有…

Spring Cloud Alibaba Nacos作为服务配置中心实践

Nacos官网文档&#xff1a;Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心 【1】服务实例 ① pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </de…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型&#xff0c;无需自行训练模型&#xff0c;即可从常见表单和文档中提取数据。 公司中&#xff0c;表单种类繁多&#xff0c;如发票、收据、调查表等。你可能想知道&#xff0c;从这些文档中提取姓名、地址、金额等信息需要多少工作…

数字化制造案例分享以及数字化制造能力评估(34页PPT)

资料介绍&#xff1a; 通过全面的数字化企业平台和智能制造技术的应用&#xff0c;制造型企业不仅提升了自身的竞争力&#xff0c;也为整个制造业的数字化转型提供了借鉴。同时&#xff0c;数字化制造能力的评估是企业实现数字化转型的关键环节&#xff0c;需要从技术变革、组…

Linux 并发与竞争基础知识学习

Linux 并发与竞争 并发与竞争 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。针对这个问题必须要做处理&#xff0c;严重的话可能会导致系统崩溃。现在的…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

C语言入门系列:运算符及其优先级

文章目录 一&#xff0c;算术运算符二&#xff0c;自增运算符与自减运算符三&#xff0c;关系运算符四&#xff0c;逻辑运算符逻辑与&#xff08;&&&#xff09;逻辑或&#xff08;||&#xff09;逻辑非&#xff08;!&#xff09;最佳实践&#xff1a;行为单一原则 五&…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

【产品经理】订单处理2

本次讲解订单初始化成功到ERP系统过程中的后续环节。 一、根据客服备注更新订单信息 初始化订单过程中&#xff0c;若订单中的客服备注信息对订单进行更新&#xff0c;包括可能改收货信息、改商品、加赠品、指定快递等。 注意&#xff1a;更新订单的过程中要注意订单当前状…

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计的支持传输速率10Mbps的总线远程终端&#xff08;RT&#xff09;模块&#xff0c;采用SIP封装技术&#xff0c;支持LocalBus接口或UART通信访问&#xff0c;64K*16bits存储空间&#xff0c;灵活的RT数据存储&#xff0c;具…

Android Room数据库使用介绍

1.简介 Room是Google提供的Android架构组件之一&#xff0c;旨在简化数据库操作。它是SQLite的一个抽象层&#xff0c;提供了更易用和安全的API。 Room的总体架构: 2.Room数据库的基础概念 Entity Entity是Room中的数据表&#xff0c;每个Entity类对应一个SQLite表。 DAO …

有什么开放式耳机值得买?六点选购建议你要注意了

作为一名数码爱好者&#xff0c;专业的数码博主&#xff0c;我只想把好的产品介绍给大家&#xff0c;让大家避雷不好用的产品&#xff0c;最近&#xff0c;很多人私信我问我开放式的耳机怎么样&#xff1f;和别的耳机又有什么区别&#xff0c;我发现大家对于开放式耳机的了解少…

什么是计算机技术与软件(初级、中级、高级)考试(软考)?

一、软考是什么&#xff1f; 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;以下简称计算机软件资格考试&#xff09;是原中国计算机软件专业技术资格和水平考试&#xff08;简称软件考试&#xff09;的完善与发展。计算机软件资格考试是由国家人力…

如何进行敏捷型数据治理?现行的数据治理体系是不是有瑕疵和遗漏?

敏捷型数据治理&#xff08;Agile Data Governance&#xff09;是一种灵活、迭代的方法&#xff0c;旨在快速响应和适应不断变化的业务需求和数据环境。与传统的数据治理方法相比&#xff0c;敏捷型数据治理更注重实践中的灵活性和速度&#xff0c;同时保持数据质量、隐私和安全…

Vue2数据响应式再次理解

今天遇到一个问题吧算是&#xff0c;项目用的vue2&#xff0c;期望把数据的某个数组清空&#xff0c;在组件内部调用this.xxarray [] 没问题&#xff0c;但是把数组引用传递到另外一个函数&#xff0c;执行赋值清空&#xff0c;会失效&#xff1b;大概的复原如下图 分析&#…

直播预约:存内计算加速大模型-未来智能计算的新引擎

直播简介: 在人工智能飞速发展的今天&#xff0c;大模型的训练和推理对计算资源的需求日益增长。传统计算架构已逐渐难以满足其对速度和效率的极致追求。本次直播&#xff0c;我们将深入探讨如何利用存内计算技术&#xff0c;为大模型带来革命性的加速效果。 直播亮点: 技术…

C++ 33 之 const 修饰静态成员

#include <iostream> #include <string.h> using namespace std;// 定义静态const数据成员时&#xff0c;最好在类内部初始化,避免在类外重复初始化&#xff0c;也为了代码的可读性和可维护性class Students03{ public:// 两种写法都可以const static int s_a 10;…

node 中间件使用例子

NodeJS在中间件领域有着较为广泛的应用&#xff0c;他能做一些中间层事件&#xff0c;把服务端一部分的代码抽出来&#xff0c;减少处理冗余事情付出的代价&#xff0c;同时让服务真正做业务处理而不用关心页面的事情 常见的应用场景有&#xff1a; 跨域&#xff1a;解决跨域问…

内存卡提示需要格式化?别急,这样拯救你的数据

一、内存卡突然提示需要格式化 在日常生活中&#xff0c;我们经常会使用到内存卡来存储照片、视频、文档等重要数据。然而&#xff0c;有时当我们试图访问内存卡时&#xff0c;却会遭遇一个令人头疼的问题——系统突然提示“内存卡需要格式化”。这意味着我们无法直接读取或写…

ARM32开发--IIC软实现

知不足而奋进 望远山而前行 目录 文章目录 前言 开发流程 GD32F4软件I2C初始化 GD32F4软件I2C引脚功能 写操作 读操作 总结 前言 在嵌入式系统开发中&#xff0c;软件实现的I2C通信协议扮演着至关重要的角色。本文将深入探讨如何在GD32F4系列微控制器上实现软件I2C功能…