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

一、实验名称

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); // 创建ServerSocketSystem.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.xdnf.cn/news/1451723.html

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

相关文章

文章分享 | Ribo-seq与RNA-seq联合分析揭示uAUG-ds翻译调控机制

技术简介 RNA-seq主要从转录组水平分析基因的表达调控机制,检测用于核糖体翻译的RNA序列及二级结构。Ribo-seq主要用于检测核糖体翻译的起始位置、翻译富集区和翻译终止位置。RNA-seq与Ribo-seq联合分析可以准确检测mRNA上游5’UTR区的uORFs翻译调控结构&#xff0…

雪球产品学习,大雪球vs小雪球

part1 大雪球 一、 雪球产品的要素 1.1 定义:固收期权的结合 具备敲入,敲出的Barrier put (看跌认沽) 期权的买方:产品发行方 期权的卖方:雪球产品购买者 1.2 七要素 挂钩标的,锁定期&…

电脑屏幕监控软件有哪些?2025年监控软件排行榜

电脑屏幕监控软件有哪些?2025年监控软件排行榜 虽然现在还是2024年,但是有一些被广泛讨论和推荐的电脑屏幕监控软件,它们将在2025年异军突起,成为行业的引领者。 1.安企神软件: 功能全面的电脑屏幕监控软件&#xf…

Sentence Transformers x SwanLab:可视化Embedding训练

Sentence Transformers(又名SBERT)是访问、使用和训练文本和图像嵌入(Embedding)模型的Python库。 你可以使用Sentence Transformers快速进行模型训练,同时使用SwanLab进行实验跟踪与可视化。 1. 引入SwanLabCallback from swanlab.integra…

【Android】打开需要NDK的项目的一些报错的问题解决

文章简述 在打开一个新的项目的时候,遇到了一些问题,记录一下问题的解决步骤。 问题1 FAILURE: Build failed with an exception.* What went wrong: A problem occurred configuring project :app. > NDK not configured. Download it with SDK m…

Pyskl动捕

一、环境搭建 详见Pytorch-gpu安装 二、下载代码 https://github.com/kennymckormick/pyskl 三、环境安装 conda create -n pyskl python=3.8 conda activate pyskl 先看下requirements.txt中需要安装的包 有些包是需要单独安装的如pytorch,这个根据自己cuda版本对应安装…

JVM之标记算法的详细解析

三色标记 标记算法 三色标记法把遍历对象图过程中遇到的对象,标记成以下三种颜色: 白色:尚未访问过 灰色:本对象已访问过,但是本对象引用到的其他对象尚未全部访问 黑色:本对象已访问过,而且…

DiffusionDet:用于物体检测的扩散模型

论文标题:DiffusionDet: Diffusion Model for Object Detection 论文地址:https://arxiv.org/pdf/2211.09788 DiffusionDet:用于物体检测的扩散模型 检测模型发展物体检测 DiffusionDet方法预备知识DiffusionDet前向扩散过程DiffusionDet反向…

【gtest】 C++ 的测试框架之使用 gtest 编写单元测试

目录 🌊前言 🌊使用 cmake 启动并运行 gtest 🌍1. 设置项目 🌍2. 创建并运行二进制文件 🌊1. gtest 入门 🌍1.1 断言(assertions) 🌍1.2 简单测试 🌍…

最新(2024年)安装gdal库方法

方法一:直接 conda install gdal 方法二:https://github.com/cgohlke/geospatial-wheels/releases/tag/v2024.2.18 这个链接里下载whl文件

Day51 代码随想录打卡|二叉树篇---二叉搜索树的最小绝对差

题目(leecode T530): 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。 方法:本题计算二叉搜索树的最小绝对差,涉…

快慢指针在字符串中的应用-443. 压缩字符串

题目链接及描述 443. 压缩字符串 - 力扣(LeetCode) 题目分析 这个题目总体不算太难,如果之前接触过双指针(快慢指针)的话,比较好做。题目可以理解为计算数组中对应各个连续字符出现的次数,并将…

测试基础13:测试用例设计方法-错误推断、因果图判定表

课程大纲 1、错误推测法 靠主观经验和直觉来推测可能容易出现问题的功能或场景,设计相关测试用例进行验证。 2、因果图&判定表 2.1定义 因果图和判定表是分析和表达多逻辑条件下,执行不同操作的情况的工具。 (因果图和判定表配合使用&a…

生产运作管理--第六版陈荣秋

第一章: 生产运作的分类有哪些? 答:可以分为两大类: 产品生产: 产品生产是通过物理或者化学作用将有形输入转化为有形输出的过程。 按照工艺过程的特点,可以分为: 连续性生产:物料均匀、连续的按…

TCP/IP协议,三次握手,四次挥手

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web …

TCP三次握手和四次挥手过程简介(抓包分析,简单易懂,小白)

接上篇 传输层部分 链路层、网络层、传输层和应用层协议详解分析-CSDN博客文章浏览阅读689次,点赞10次,收藏15次。wireshark抓包分析-CSDN博客wireshark是网络包分析工具网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细…

6年前端社招一个月上岸20K经历,附简历

面经哥只做互联网社招面试经历分享,关注我,每日推送精选面经,面试前,先找面经哥 本人普通本科6年前端经历,从年前开始准备跳槽,一开始感觉自己履历算不上突出,经历过迷茫和沮丧的时候&#xff0…

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

MySQL日志(二):MySQL抖动

一条SQL语句, 正常执行的时候特别快, 但是有时也不知道怎么回事, 它就会变得特别慢, 并且这样的场景很难复现, 它不只随机, 而且持续时间还很短。 看上去, 这就像是数据库“抖”了一下。 今天&…

redis 笔记2之哨兵

文章目录 一、哨兵1.1 简介1.2 实操1.2.1 sentinel.conf1.2.2 问题1.2.3 哨兵执行流程和选举原理1.2.4 使用建议 一、哨兵 1.1 简介 上篇说了复制,有个缺点就是主机宕机之后,从机只会原地待命,并不能升级为主机,这就不能保证对外…