5-1 Java 网络编程

第1关:URL类与InetAddress类
任务描述

本关任务:了解网络编程基础知识。

相关知识

为了完成本关任务,你需要掌握:1.URL;2.InetAddress。

URL

统一资源定位符(Uniform Resource Locator,缩写为URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL可以分为如下几个部分:

protocol://host:port/path?query#fragment

HTTP 协议的 URL 实例如下:

http://www.runoob.com/index.html?language=cn#javase
  • 协议为(protocol):http
  • 主机为(host:port):www.runoob.com
  • 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80
  • 文件路径为(path):/index.html
  • 请求参数(query):language=cn
  • 定位位置(fragment):javase,定位到网页中 id 属性为 javaseHTML 元素位置。
URL对象

java.net 包中的 URL 类是对统一资源定位符的抽象,使用 URL 创建对象的应用程序称作客户端程序。一个URL 对象通常包含最基本的三部分信息:协议、地址和资源。

  1. URL对象定义 public URL(String spec) throws MalformedURLException public URL(String protocol, String host, String file) throws MalformedURLException
  2. 读取 URL 中的资源: URL 对象调用 InputStream openStream()方法返回一个输入流,该输入流指向 URL 对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。
InetAddress 类

InetAddress类是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress类,包括:ServerSocketSocketDatagramSocket等等。 InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址。 为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例。

  1. getByName(String s):获取InetAddress对象
  • 域名作为getByName()getAllByName()方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用 getHostName()时,就无需再访问DNS服务器,而是直接将这个域名返回。
  • IP地址作为getByName()getAllByName()getByAddress()方法的参数,创建InetAddress对象时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName()方法来完成。如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。
  • 主机名作为参数创建InetAddress对象。
  • 静态方法getLocalHost()获取本机的InetAddress。如果获取不到(可能是安全问题),就会返回地址:127.0.0.1 和 主机名:localhost
  1. getByAddress(byte[] addr):根据源IP地址来获取InetAddress对象。
编程要求

根据提示,使用URL类和InetAddress类编程,在右侧编辑器 Begin-End 补充代码。

  1. 使用java.netURL类获取URL的各个部分参数
  2. 使用InetAddress类的getAllByName()方法,输出百度主机的所有地址
测试说明

平台会对你编写的代码进行测试:

测试输入:

预期输出:

协议为:http

主机名:www.runoob.com

路径:/index.html

端口:-1

请求参数:language=cn

www.baidu.com/180.101.50.188

www.baidu.com/180.101.49.242

注明:百度主机输出结果的顺序不一致时,可以多评测几次。

代码实现

package step1;

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;

public class Step1Test
{
    public static void main(String[] args)
    {
        // URL地址:http://www.runoob.com/index.html?language=cn#javase
        // 1. 要求输出:协议、主机名、路径、端口、请求参数
        // ********** Begin **********

        try
        {
            URL url = new URL("http://www.runoob.com/index.html?language=cn#javase");

            System.out.println("协议为:" + url.getProtocol());
            System.out.println("主机名:" + url.getHost());
            System.out.println("路径:" + url.getPath());
            System.out.println("端口:" + url.getPort());
            System.out.println("请求参数:" + url.getQuery());
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }

        // 2. 输出百度的所有主机地址
        // ********** End **********

        try
        {
            InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");
            // for (InetAddress address : addresses)
            // {
            //     System.out.println("www.baidu.com/" + address.getHostAddress());
            // }
            System.out.println("www.baidu.com/" + addresses[0].getHostAddress());
            System.out.println("www.baidu.com/" + addresses[1].getHostAddress());
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
    }
}
第2关:TCP Socket通信
任务描述

本关任务:编写程序实现基于TCP/IP协议的Socket通信。

相关知识

为了完成本关任务,你需要掌握:1.TCP/IP协议,2.Socket套接字,3.基于TCP/IP协议的Socket通信。

OSI参考模型和TCP/IP模型

计算机网络市场刚刚兴起时,许多计算机生产厂商都积极推出自己公司独创的网络。由于这些网络都不互通,导致使用某种网络的用户如果在后续扩展网络时必须继续使用原计算机厂商的设备。这样使得市场上各自保护现象很严重。基于上述原因,国际标准化组织制定了一套标准,只要大家都遵循这套标准,那么各自的产品就可以相互兼容,这套标准就叫OSI参考模型。正所谓“没有规矩不成方圆”。 OSI参考模型分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。分层有助于把网络操作分成不太复杂的单元,分工合作,责任明确。

TCP/IP模型严格来说是一个四层的体系结构。应用层、传输层、网络层和数据链路层都包含其中。虽然它有四层网络模型层数,只是因为在TCP/IP模型中TCP模型和IP模型最具代表性,所以被称为TCP/IP模型。TCP/IP模型具有数据的时新性、具有数据的时新性和传输技术的先进易用性。

在这里插入图片描述

TCP/IP协议

从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。它们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。
在这里插入图片描述

Socket套接字

我们可以把所有渴望建立连接的对象都理解为套接字。要想建立网络连接,就像插头与插座套接在一起,而“字”则代表了可交互的有序指令串。Socket的引入就是为了解决不同计算机之间进程间相互通信的问题。
在这里插入图片描述

IP层的IP地址可以唯一标识Internet上的计算机,而TCP层协议和端口号可以唯一标识计算机上运行的一个进程,这样我们可以利用“IP地址+协议+端口号”来唯一标识网络中的一个进程。IP地址与端口号的组合可以得出一个Socket即网络套接字。Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作,抽象为几个简单的接口供应用层调用,以实现进程在网络中的通信。能够唯一标识网络中的进程后,就可以利用Socket进行通信了。

Socket通信模型

具体地,Socket通信的过程,它通常分为三个步骤,分别是:服务器监听,客户端请求,连接确认。在 Java 语言中,需要使用 java.net 包中的ServerSocket类和Socket类来实现。

在这里插入图片描述

编程要求

请编写程序实现基于TCP/IP协议的Socket通信过程。 服务器端程序平台已经编写完毕。需要你根据提示,在右侧编辑器补充客户端代码。

  • 服务器端开放: IP地址:127.0.0.1 端口号:8889
  • 客户端发送数据: Hello Server!
测试说明

服务器端代码:

public class Server 
{
     public static void main(String[] args) 
     {
      try 
      {
         ServerSocket ss = new ServerSocket(8889);
         System.out.println("启动服务器....");
         Socket s = ss.accept();
         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
         //读取客户端发送来的消息
         String mess = br.readLine();
         System.out.println("客户端:" + mess);
         ss.close();
      } 
      catch (IOException e) 
      {
         e.printStackTrace();
      }
   }
}

平台会对你编写的代码进行测试:

测试输入:

启动服务器…

客户端:测试客户端与服务器通信:Hello Server!

开始你的任务吧,祝你成功!

代码实现

package step2;

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

/**
 * 描述:描述:第2关:TCP Socket通信
 *
 * @author 为一道彩虹
 */
public class Client 
{
    public static void main(String[] args)
    {
        try 
        {
            // 连接到IP地址为127.0.0.1,端口号为8889的服务器
            Socket socket = new Socket("127.0.0.1", 8889);

            // 获取socket的输出流
            OutputStream outputStream = socket.getOutputStream();

            // 使用PrintWriter包装输出流,方便发送字符串
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);

            // 发送数据到服务器
            writer.println("测试客户端与服务器通信:Hello Server!");

            // 关闭连接
            socket.close();
        }
        catch (UnknownHostException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}
第3关:UDP Socket通信
任务描述

本关任务:编写程序实现基于UDP协议的Socket通信。

相关知识

为了完成本关任务,你需要掌握:1.UDP协议,2.Socket套接字,3.基于UDP协议的Socket通信。

UDP协议

基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。即数据在传输时,用户无法知道数据能否正确到达目的地主机,也不能确定数据到达目的地的顺序是否和发送的顺序相同。UDP通信比作邮递信件。

基于UDP通信的基本模式:

  • 将数据打包,称为数据包,然后将数据包发往目的地。
  • 接收别人发来的数据包,然后查看数据包中的内容。
Socket套接字

我们可以把所有渴望建立连接的对象都理解为套接字。要想建立网络连接,就像插头与插座套接在一起,而“字”则代表了可交互的有序指令串。Socket的引入就是为了解决不同计算机之间进程间相互通信的问题。
在这里插入图片描述

IP层的IP地址可以唯一标识Internet上的计算机,而TCP层协议和端口号可以唯一标识计算机上运行的一个进程,这样我们可以利用“IP地址+协议+端口号”来唯一标识网络中的一个进程。IP地址与端口号的组合可以得出一个Socket即网络套接字。Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作,抽象为几个简单的接口供应用层调用,以实现进程在网络中的通信。能够唯一标识网络中的进程后,就可以利用Socket进行通信了。

UDP Socket通信模型
  1. DatagramPacket 类将数据打包,有两个构造方法:
  • public DatagramPacket(byte[] data, int length, InetAddress address, int port);
  • public DatagramPacket(byte[] data, int offset, int length, InetAddress address, int port);
  1. DatagramSocket 类的不带参数的构造方法 DatagramSocket()创建一个对象,该对象负责发送数据包。
DatagramSocket mail_out = new DatagramSocket(); 
Mail_out.send(data_pack);
  1. DatagramSocket 类的另一个构造方法 DatagramSocket(int port)创建一个对象,其中的参数必须和待接收数据包的发送端口号相同。
DatagramSocket mail_in = new DatagramSocket(5666); 
  1. 然后对象 mail_in 使用方法 receive(DatagramPacket pack) 接收数据包。必须预备一个数据包以便接收数据包。这时需要使用DatagramPacket 类的另外一个构造方法 DatagramPacket(byte[] data, int length) 创建一个数据包。
byte[] data = new byte[100];
int length = 90;
DatagramPacket pack = new DatagramPacket(data, length);
mail_in.receive(pack);
编程要求

请编写程序实现基于UDP协议的Socket通信过程。 客户端程序平台已经编写完毕。需要你根据提示,在右侧编辑器补充服务器端代码。 服务器端开放:

IP地址:127.0.0.1或者localhost

端口号:12345

用于接收从客户端发送过来的数据:

用户名:admin;密码:123

测试说明

客户端代码:

public class UDPClient 
{
    public static void main(String[] args) throws IOException 
    {
        /*
         * 向服务器端发送数据
         */
        // 1.定义服务器的地址、端口号、数据
        InetAddress address = InetAddress.getByName("localhost");
        int port = 12345;
        byte[] data = "用户名:admin;密码:123".getBytes();
        // 2.创建数据报,包含发送的数据信息
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        // 3.创建DatagramSocket对象
        DatagramSocket socket = new DatagramSocket();
        // 4.向服务器端发送数据报
        socket.send(packet);
        // 5.关闭资源
        socket.close();
    }
}

平台会对你编写的代码进行测试:

测试输入:

预期输出:

****服务器端已经启动,等待客户端发送数据

我是服务器,客户端说:用户名:admin;密码:123

开始你的任务吧,祝你成功!

代码实现

 package step3;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer
{
    public static void main(String[] args) throws IOException
    {
        /*
         * 接收客户端发送的数据
         */
        // 1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket = new DatagramSocket(12345);

        // 2.创建数据报,用于接收客户端发送的数据
        // 创建字节数组,指定接收的数据包的大小1024
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

        System.out.println("****服务器端已经启动,等待客户端发送数据");

        // 3.接收客户端发送的数据
        socket.receive(receivePacket);

        // 4.读取数据
        String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
        System.out.println("我是服务器,客户端说:" + receivedMessage);

        // 5.关闭资源
        socket.close();
    }
}

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

闪存组织结构概念

文章目录 一、几种不同类型闪存的参数:二、组织结构三、块(Block)的结构擦除动作原理:写操作读操作 一、几种不同类型闪存的参数: 参数项SLCMLCTLCQLC读取时间/us20~2555~11075~170120~200写入时间/us50~100400~15008…

服务器中了elbie勒索病毒解决办法,elbie勒索病毒解密数据恢复

科技技术的不断发展,为企业的生产运营提供了极大便利,但网络安全威胁也不断增加,近期云天数据恢复中心陆续接到很多企业的求助,企业的服务器中了elbie勒索病毒,导致系统瘫痪,所有业务无法正常开展&#xff…

【深度学习】脸部修复,CodeFormer,论文,实战

代码: https://github.com/sczhou/CodeFormer 论文:https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工作**4 实验****4.1 数据集****4.2 实验设置和指标***…

Springboot-热部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

opencv-Canny 边缘检测

Canny边缘检测是一种经典的图像边缘检测算法&#xff0c;它在图像中找到强度梯度的变化&#xff0c;从而识别出图像中的边缘。Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中&#xff0c;cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下&#xff1a; edges…

Cent OS 8.2 安装 自定义硬盘 固定IP VMware

时间&#xff1a;20231122 环境&#xff1a;win11 、VMware 16 pro、Cent OS 8.2 说明&#xff1a;自定义安装方法、自定义硬盘分区、固定IP且能联网 1、使用自定义的方式安装虚拟机 此处选择典型&#xff0c;则会自动安装系统&#xff0c;无法自定义硬件以及配置信息 选择…

〖大前端 - 基础入门三大核心之JS篇㊶〗- DOM事件传播和事件监听方法addEventListener()

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

用于 syslog 收集的协议:TCP、UDP、RELP

系统日志是从 Linux/Unix 设备和其他网络设备&#xff08;如交换机、路由器和防火墙&#xff09;生成的日志 可以通过将 syslog 聚合到称为 syslog 服务器、syslog 守护程序或 syslogd 的服务器来集中 syslog。在TCP、UDP和RELP协议的帮助下&#xff0c;系统日志从设备传输到系…

js双击修改元素内容并提交到后端封装实现

前面发过一个版本了&#xff0c;后来又追加了些功能。重新发一版。新版支持select和radio。 效果图&#xff1a; 右上角带有绿标的&#xff0c;是可以修改的单元格。如果不喜欢显示绿标&#xff0c;可以传递参数时指定不显示&#xff0c;如果想改为其它颜色&#xff0c;也可以…

SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 负载均衡

目录 一、LoadBalancer 负载均衡 1.1、前言 1.2、LoadBalancer 负载均衡底层实现原理 二、整合 OpenFeign LoadBalancer 2.1、所需依赖 2.2、具体实现 2.3、自定义负载均衡策略 一、LoadBalancer 负载均衡 1.1、前言 在 2020 年以前的 SpringCloud 采用 Ribbon 作为负载…

C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)

题目描述 计算两个矩阵A和B的乘积。 输入第一行三个正整数m、p和n&#xff0c;0<m,n,p<10&#xff0c;表示矩阵A是m行p列&#xff0c;矩阵B是p行n列&#xff1b;接下来的m行是矩阵A的内容&#xff0c;每行p个整数&#xff0c;用空格隔开&#xff1b;最后的p行是矩阵B的内…

Java架构师软件架构开发

目录 1 基于架构的软件开发导论2 ABSD架构方法论3 ABSD方法论具体实现4 ABSD金融业案例5 基于特定领域的软件架构开发导论6 DSSA领域分析7 DSSA领域设计和实现8 DSSA国际电商平台架构案例9 架构思维方法论概述10 AT方法论和案例想学习架构师构建流程请跳转:Java架构师系统架构…

人工智能和AR/VR:AI在AR和VR中扮演什么角色?行业应用有哪些?

增强现实技术和虚拟现实技术&#xff08;AR/VR&#xff09;发展前景广阔&#xff0c;备受各大企业关注。事实上&#xff0c;近四分之三的行业领导者表示&#xff0c;他们预计这些沉浸式技术将于未来五年内成为主流。高盛公司报告称&#xff0c;到2025年&#xff0c;AR/VR行业值…

485 实验

485(一般称作 RS485/EIA-485)隶属于 OSI 模型物理层&#xff0c;是串行通讯的一种。电气特性规定 为 2 线&#xff0c;半双工&#xff0c;多点通信的类型。它的电气特性和 RS-232 大不一样。用缆线两端的电压差值 来表示传递信号。RS485 仅仅规定了接受端和发送端的电气特性。它…

【网络奇缘】- 计算机网络|性能指标|体系结构

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 温故而知新 计算机网络性能指标 时延 时延带宽积 往返时延RTT 访问百度​编辑 访问b站 访问谷歌 …

Centos 7 安装yum(针对python卸载yum出错)

提前下载所需安装包&#xff0c;按照下面顺序安装即可完成&#xff0c;每个依赖包必须正确安装 下载地址&#xff1a;http://mirrors.163.com/centos/7/os/x86_64/Packages/ rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联 whereis …

VsCode学习

一、在VsCode 上编写第一个C语言 在VsCode上写代码都是先打开文件夹&#xff0c;这样也方便管理代码和编译器产生的可执行程序&#xff0c;VsCode生成的配置文件等。 1.1打开文件夹 写代码前&#xff0c;首先创立一个文件夹存储以后我们写的VsCode代码&#xff0c;便于管理。…

Scala如何写一个通用的游戏数据爬虫程序

以前想要获取一些网站数据的时候&#xff0c;都是通过人工手动复制粘贴&#xff0c;这样的效率及其低下。数据少无所谓&#xff0c;如果需要采集大量数据&#xff0c;手动就显得乏力了。半夜睡不着&#xff0c;爬起来写一段有关游戏商品数据的爬虫通用模板&#xff0c;希望能帮…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳转&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年开发&#xff0c;是一种工业现场总线协议标准。 Modbus 通信协议具有多个变种&#xff0c;支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的…

基于STM32的色彩识别与分类算法优化

基于STM32的色彩识别与分类算法优化是一项与图像处理和机器学习相关的研究任务&#xff0c;旨在实现高效的色彩识别和分类算法在STM32微控制器上的运行。本文将介绍基于STM32的色彩识别与分类算法优化的原理和实现步骤&#xff0c;并提供相应的代码示例。 1. 色彩识别与分类概…