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属性为javase的HTML元素位置。
URL对象
java.net 包中的 URL 类是对统一资源定位符的抽象,使用 URL 创建对象的应用程序称作客户端程序。一个URL 对象通常包含最基本的三部分信息:协议、地址和资源。
URL对象定义public URL(String spec) throws MalformedURLExceptionpublic URL(String protocol, String host, String file) throws MalformedURLException- 读取
URL中的资源:URL对象调用InputStream openStream()方法返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。
InetAddress 类
InetAddress类是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress类,包括:ServerSocket,Socket,DatagramSocket等等。 InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址。 为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。
该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例。
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。
getByAddress(byte[] addr):根据源IP地址来获取InetAddress对象。
编程要求
根据提示,使用URL类和InetAddress类编程,在右侧编辑器 Begin-End 补充代码。
- 使用
java.net的URL类获取URL的各个部分参数 - 使用
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通信模型
- 用
DatagramPacket类将数据打包,有两个构造方法:
public DatagramPacket(byte[] data, int length, InetAddress address, int port);public DatagramPacket(byte[] data, int offset, int length, InetAddress address, int port);
- 用
DatagramSocket类的不带参数的构造方法DatagramSocket()创建一个对象,该对象负责发送数据包。
DatagramSocket mail_out = new DatagramSocket();
Mail_out.send(data_pack);
- 用
DatagramSocket类的另一个构造方法DatagramSocket(int port)创建一个对象,其中的参数必须和待接收数据包的发送端口号相同。
DatagramSocket mail_in = new DatagramSocket(5666);
- 然后对象
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.创建数据报,用于接收客户端发送的数据// 创建字节数组,指定接收的数据包的大小1024byte[] 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();}
}
先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!
相关文章:
5-1 Java 网络编程
第1关:URL类与InetAddress类 任务描述 本关任务:了解网络编程基础知识。 相关知识 为了完成本关任务,你需要掌握:1.URL;2.InetAddress。 URL 统一资源定位符(Uniform Resource Locator,缩…...
汇编-CALL和RET指令
CALL指令调用一个过程, 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作: 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…...
STM32_5(中断)
中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行中断优先级:当…...
docker 部署hbase 并且java Api连接
首先先运行容器 docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p16000:16000 -p 16020:16020 -p 16030:16030 harisekhon/hbase2.在本机的hosts中注册docker的id 因为docker内部集成了其他环境而其他环境 中的ip是docker id 所以需要在hosts中转换 192.168.80.120…...
EasyExcel listener无法通过Autowired注入xxMapper
easyexcel listener无法通过Autowired注入xxMapper 文章目录 easyexcel listener无法通过Autowired注入xxMapperbug记录:解决方案:easyexcel 使用例子controllerServiceImpllistener bug记录: productMapper注入一直为null,而procureDetailM…...
Android Spannable 使用注意事项
1、当前示例中间的 "评论",使用SpannableStringBuilder实现,点击评论会有高亮效果加粗,但再点击其它Bar时无法恢复默认样式。 2、因为SpannableString或SpannableStringBuilder中的效果是叠加的,恢复默认样式需要先移除…...
Apache访问控制
服务器相关的访问控制 Options指令 Options指令是Apache服务器配置文件中的一个重要指令,它可以用于控制特定目录启用哪些服务器特性。Options指令可以在Apache服务器的核心配置、虚拟主机配置、特定目录配置以及.htaccess文件中使用。 以下是一些常用的服务器特性选项: N…...
二、类与对象(二)
8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date: #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…...
Pytorch从零开始实战10
Pytorch从零开始实战——ResNet-50算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50算法实战环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8,…...
设计模式-单例模式实战
目录 一、引言二、适用场景三、代码实战饿汉式单例模式懒汉式单例模式双重检查锁定单例模式静态内部类单例模式 四、实际应用举例Runtime解析 五、结论 一、引言 单例模式是一种创建型设计模式,用于确保一个类只有一个实例,且提供全局访问点以访问该实例…...
requests库出现AttributeError问题的修复与替代方法
在使用App Engine时,开发者们通常会面临需要发送爬虫ip请求的情况,而Python中的requests库是一个常用的工具,用于处理爬虫ip请求。然而,在某些情况下,开发者可能会遇到一个名为AttributeError的问题,特别是…...
opencv-2D直方图
cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图,用于分析图像中像素值的分布。 基本的语法如下: hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明: images:…...
读像火箭科学家一样思考笔记06_初学者之心
1. 专业化是目前流行的趋势 1.1. 通才(generalist)是指博而不精之人 1.2. 懂得的手艺越多,反而会家徒四壁 1.2.1. 希腊谚语 1.3. 这种态度代价很大,它阻断了不同学科思想的交融 2. 组合游戏 2.1. 某个行业的变革可能始于另一…...
中职组网络安全 Server-Hun-1.img Server-Hun-2.img
一串密码 smbuser用户和密码登录ssh还是失败提示需要密钥,尝试ftp登录成功 发现密钥存放在.ssh/下,在kali上生成一个密钥,通过上传到.ssh/下,将其替换掉 使用kali生成密钥 登录成功,但是无法拿到root目录下的flag 获取root用户权限…...
基于区域划分的GaN HEMT 准物理大信号模型
GaN HEMT器件的大信号等效电路模型分为经验基模型和物理基模型。经验基模型具有较高精度但参数提取困难,特别在GaN HEMT器件工艺不稳定的情况下不易应用。相比之下,物理基模型从器件工作机理出发,参数提取相对方便,且更容易更新和…...
laravel引入element-ui后,blade模板中使用elementui时,事件未生效问题(下载element-ui到本地直接引入项目)
背景 重构公司后台项目,使用了dcat-admin,但是dcat-admin有些前端功能不能满足需求。因此引入element-ui进行相关界面的优化 具体流程 1.下载element-ui到本地 2.进入如下目录 打开 node_modules\element-ui\lib 复制index.js 打开 node_modules/ele…...
【计算机网络笔记】路由算法之层次路由
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
【华为OD机试python】分糖果【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够) 取出一个糖果或放回一个糖果。 小明最少需要多…...
ARM 汇编基础
我们在学习 STM32 的时候几乎没有用到过汇编,可能在学习 UCOS 、 FreeRTOS 等 RTOS 类操作系统移植的时候可能会接触到一点汇编。但是我们在进行嵌入式 Linux 开发的时候是绝 对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一上电 SP 指针还…...
虹科Pico汽车示波器 | 汽车免拆检修 | 2017款东风本田XR-V车转向助力左右不一致
一、故障现象 一辆2017款东风本田XR-V车,搭载R18ZA发动机,累计行驶里程约为4万km。车主反映,车辆行驶或静止时,向右侧转向比向左侧转向沉重。 二、故障诊断 接车后试车,起动发动机,组合仪表上无故障灯点亮&…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
