【Java基础】 网络编程

在数字化时代,网络编程已成为软件开发中的重要组成部分。无论是构建分布式系统、实现实时通讯还是进行Web开发,都需要深入了解网络编程的基础知识和技术。这种技能不仅在IT领域至关重要,还在非计算机行业的岗位中发挥着越来越重要的作用。Java网络编程是指用Java语言编写的在多个设备之间通过网络进行通信的程序。网络编程的核心在于实现不同计算机之间的数据交换,而Java为此提供了丰富的类库和接口。

一般情况下,在进行网络编程之前,应该掌握与网络有关的知识,甚至对细节也非常熟悉。例如网络通信协议、网络参考模型等。本文只介绍Java网络编程的相关概念,有关网络知识的内容请参看其他资料。

一、 网络编程的概念

网络编程是指编写程序使互联网中的两个或多个设备之间进行数据传输与通信。它主要涉及网络设备的行为和流量控制,通常由独立于网络硬件运行的软件处理。网络编程将网络的控制平面与数据平面分离,从而提高了网络的可编程性和灵活性。

网络编程的基本概念包括客户端和服务器、请求和响应以及Socket套接字等。客户端是主动发起通信的一方,而服务器则是被动接受连接并提供服务。在基于TCP/IP协议的网络通信中,Socket套接字作为基本的操作单元起着关键作用。网络编程中的传输层主要使用两种协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供的是面向连接、可靠的传输,适用于需要保证数据完整性和顺序的应用场景;而UDP则提供无连接、不可靠的传输,适用于对实时性要求高但可以容忍部分数据丢失的场景。

Java语言的网络编程

Java语言的网络编程分为三个层次:

  1. 最高一级的网络通信就是从网络上下载小程序。客户端浏览器通过HTML文件中的 <applet> 标记来识别小程序,并解析小程序的属性,通过网络获取小程序的字节码文件。
  2. 次一级的通信,就是通过URL类的对象指明文件所在位置,并从网络上下载图像、音频和视频文件等 ,然后对图像显示、对音频和视频进行播放。
  3.  最低一级的通信是利用 java.net 包中提供的类直接在程序中实现网络通信。

针对不同层次的网络通信,Java语言提供的网络功能有四大类:URL、InetAddressSocket 和 Datagram。
URL:面向应用层,通过URL,Java程序可以直接输出或读取网络上的数据。
InetAddress:面向的是IP层,用于标识网络上的硬件资源。
Socket Datagram:面向的是传输层。Socket使用TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信;Datagram 则使用UDP协议,是另一种网络传输方式,它把数据的目的地址记录在数据包中,然后直接放在网络上。


Java语言网络编程中主要使用的 java.net 包中的类包括

面向 IP 层的类  ————  InetAddress
面向应用层的类  ————  URLURLConnection
TCP协议相关类  ————  SocketServerSocket
UDP协议相关类  ————  DatagramPacketDatagramSocketMulticastSocket

二、URL编程 

Java 语言的  java.net.URL 类和  java.net.URLConnection 类使编程人员能很方便地利用URL在Internet上进行网络通信。

1、创建URL对象

Java语言利用URL类来访问网络上的资源,URL类是 java.lang.Object 类的直接子类

2、URL的常用方法

方法功能说明
public boolean equals(Object obj)判断两个URL是否相同
public final Object getContent()获取 URL连接的内容
public String getProtocol()返回URL对象的协议名称
public String getHost()返回URL对象访问的计算机名称
public int getPort()返回URL对象访问的端口号
public String getFile()返回URL指向的文件名
public String getPath()返回URL对象所使用的文件路径
public String getRef( )返回URL对象的引用字符串,即获取参考点
public URLConnection openConnection( )打开URL指向的连接
public final InputStream openStream( )打开输人流
public String toString()返回整个 URL字符串

3.代码示例:使用URL类访问网络资源

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;public class URLExample {public static void main(String[] args) {try {// 创建URL对象URL url = new URL("https://www.example.com");// 打开连接并获取输入流BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));// 读取网页内容并输出String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 关闭输入流reader.close();} catch (Exception e) {e.printStackTrace();}}
}

上述代码中,我们首先创建了一个URL对象,指定要访问的网址为"https://www.example.com"。然后,通过调用url.openStream()方法打开与该URL的连接,并获取输入流。接下来,我们使用BufferedReaderInputStreamReader来逐行读取网页的内容,并将其输出到控制台。最后,记得关闭输入流以释放资源

三、Socket编程

Socket(套接字)是网络通信中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。Socket编程的主要目的是实现不同计算机之间的有效通信。

在Java中,可以使用 java.net 包中的 Socket 类和 ServerSocket 类来实现Socket编程。Socket类表示客户端套接字,用于与服务器建立连接并发送/接收数据;ServerSocket类表示服务器端套接字,用于监听客户端连接请求并创建相应的Socket对象。

以下是一个简单的Java Socket编程示例

1.创建一个服务器端程序,监听指定端口,等待客户端连接:

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建一个ServerSocket对象,监听8080端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器已启动,等待客户端连接...");// 调用accept()方法,等待客户端连接Socket socket = serverSocket.accept();System.out.println("客户端已连接,IP地址:" + socket.getInetAddress().getHostAddress());// 关闭ServerSocketserverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

2. 创建一个客户端程序。连接到服务器并发送数据 

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {// 创建一个Socket对象,连接到服务器Socket socket = new Socket("localhost", 8080);System.out.println("已连接到服务器");// 获取输出流,向服务器发送数据OutputStream outputStream = socket.getOutputStream();PrintWriter printWriter = new PrintWriter(outputStream);printWriter.write("Hello, Server!");printWriter.flush();// 关闭Socketsocket.close();} catch (IOException e) {e.printStackTrace();}}
}

 四、HTTP客户端

HTTP客户端在Java网络编程中起着至关重要的作用,它允许开发者以编程方式与Web服务器进行交互,获取数据或执行其他Web服务操作。Java提供了 HttpURLConnection 类,用于实现HTTP客户端的编程。

以下是一个简单的例子,展示如何使用Java标准库中的 HttpURLConnection 实现HTTP GET请求:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpClientExample {public static void main(String[] args) throws Exception {// 创建URL对象URL url = new URL("http://example.com");// 打开连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为GETconnection.setRequestMethod("GET");// 获取响应码int responseCode = connection.getResponseCode();System.out.println("响应码: " + responseCode);// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 输出响应内容System.out.println(response.toString());// 关闭连接connection.disconnect();}
}

五、InetAddress 程序设计

InetAddress是Java网络编程中的一个类,用于表示互联网协议(IP)地址。它提供了一些方法来获取和操作IP地址。以下是一个简单的示例,展示了如何使用InetAddress类:

import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressExample {public static void main(String[] args) {try {// 获取本地主机的InetAddress对象InetAddress localHost = InetAddress.getLocalHost();System.out.println("本地主机名: " + localHost.getHostName());System.out.println("本地IP地址: " + localHost.getHostAddress());// 根据主机名获取InetAddress对象InetAddress googleHost = InetAddress.getByName("www.google.com");System.out.println("Google主机名: " + googleHost.getHostName());System.out.println("Google IP地址: " + googleHost.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}
}

以上是对Java网络编程概念以及常用方法的介绍!

希望本文对你理解和应用Java网络编程有所帮助!

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

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

相关文章

如何找到合适的Python第三方库?

找合适的Python库其实很简单&#xff0c;按照以下三步法&#xff0c;你能找到90%的Python库。 1、百度谷歌搜索 明确自己的需求&#xff0c;用Python来干什么&#xff0c;力求简短明了。比如定位“数据分析”&#xff0c;然后去搜索关键词【Python数据分析第三方库】&#xf…

基于 JWT 进行身份验证

一、JWT 介绍 JWT 本质上就是一组字串&#xff0c;通过&#xff08;.&#xff09;切分成三个为 Base64 编码的部分&#xff1a; Header : 描述 JWT 的元数据&#xff0c;定义了生成签名的算法以及 Token 的类型。Payload : 用来存放实际需要传递的数据Signature&#xff08;签…

考研数学|张宇和武忠祥,强化能不能同时跟?

可以说你跟武老师学明白了&#xff0c;120完全没问题&#xff01;如果追求更高&#xff0c;宇哥的怀抱也想你敞开&#xff01; 学长我21年一战数学83&#xff0c;总分没过线&#xff0c;22年二战143&#xff0c;逆袭上岸211&#xff01;市面上的老师我基本都听过&#xff0c;最…

微深节能 料场堆取料无人操作系统 格雷母线

格雷母线高精度位移检测系统在料场堆取料中的应用是一个重要的技术进步&#xff0c;它极大地提升了堆取料作业的自动化和精确性。 一、格雷母线定位系统概述 格雷母线高精度位移测量系统&#xff0c;包括格雷母线、天线箱、地址解码器、地址编码器四个部分组成。 格雷母线类似一…

大数据面试题之Hive(3)

目录 Hive的函数:UDF、UDAF、UDTF的区别? UDF是怎么在Hive里执行的 row_number&#xff0c;rank&#xff0c;dense_rank的区别 Hive count(distinct)有几个reduce&#xff0c;海量数据会有什么问题 HQL&#xff1a;行转列、列转行 一条HQL从代码到执行的过程 了解Hive S…

深入探索Kylin的Cube构建:数据魔方的构建之旅

深入探索Kylin的Cube构建&#xff1a;数据魔方的构建之旅 引言 Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop和Spark之上的高性能数据立方体&#xff08;Cube&#xff09;技术。Kylin的Cube构建过程是其核心功能之一&#xff0c;它允许用户定义和构建多维数…

手动指定ubuntu环境下程序打包指定目录

Ubuntu在打包过程请自行检索其它文章&#xff1b; 在打包时候默认不能打包一些静态资源的&#xff0c;比如以配置文件为例config目录 当程序打包安装后&#xff0c;安装目录中没有config目录&#xff0c;这时候就需要我们手动创建config目录及目录中对应的配置文件等内容&…

Java养老护理助浴陪诊小程序APP源码

&#x1f496;护理助浴陪诊小程序&#x1f496; 一、引言&#xff1a;养老新趋势&#x1f331; 在快节奏的现代生活中&#xff0c;养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务&#xff0c;让他们晚年生活更加安心、舒适&#xff0c;是我们每个人都需…

持续总结中!2024年面试必问的操作系统面试题(三)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问的操作系统面试题&#xff08;二&#xff09;-CSDN博客 五、什么是分页和分段&#xff1f;它们之间有什么区别&#xff1f; 分页和分段是操作系统中用于内存管理的两种不同技术&#xff0c;它们都旨在允许操作系统…

v-model中.lazy、.number、.trim

在Vue.js中&#xff0c;v-model 是一个非常核心的指令&#xff0c;它主要用于在表单输入和应用状态之间建立双向绑定。 Vue.js 提供了一些修饰符&#xff08;modifiers&#xff09;&#xff0c;这些修饰符可以用来指定不同的行为。.lazy、.number 和 .trim 就是这样的修饰符。 …

篮球联盟管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;球员管理&#xff0c;用户管理&#xff0c;球队管理&#xff0c;论坛管理&#xff0c;篮球资讯管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0…

Transformer常见面试题

目录 1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09; 2.Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘&#xff1f; &#xff08;注意和第一个问题的区别&#xff09; 3.Transf…

位运算符计算规则及使用场景

位运算符包括按位与&、按位异或^、按位或|、按位取反~、左移<<、右移>> 1.&&#xff08;按位与&#xff09;1&#xff09;限定数值范围2&#xff09;权限检测3&#xff09;掩码操作 2.^&#xff08;按位异或&#xff09;1&#xff09;两值交换2&#xff09…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

Linux系统中根下的目录结构介绍

一、Linux的路径分隔符 Linux系统中使用正斜杠(/)作为路径分隔符&#xff1b;每个目录的后面都默认带有一个正斜杠&#xff08;如&#xff1a;需要进入opt目录可以分别使用【cd /opt】或【cd /opt/】&#xff09; 二、Linux根目录下各个目录结构介绍 红色标识的文件夹为Linux的…

“开源AI”到底是什么意思

开源与专有软件之间的斗争早已为人所熟知。然而&#xff0c;长期以来弥漫在软件圈的紧张关系已经渗透到了人工智能领域&#xff0c;部分原因在于没有人能在AI背景下就“开源”的真正含义达成一致。 相关阅读&#xff1a;GPT-4o通过整合文本、音频和视觉实现人性化的AI交互&…

PTP时间同步协议简介

注意&#xff0c;上图中 t1 t4 都是主机时间。 t2 t3 都是从机时间。 总延迟为 (t4 - t1) - (t3 - t2) 单边的平均延迟为 ((t4 - t1) - (t3 - t2) ) / 2&#xff0c;公式d1 两边的时钟偏差为 (((t3 t2) / 2)) - ((t4 t1) / 2) 也可以通过下面2个式子 t2 offset delay t1…

Orangepi Zero2 全志H616 的初识

目录 一、全志H616简介 1.1 为什么学&#xff1a; 1.2 学什么&#xff1a; 1.3 全志H616平台介绍&#xff1a; 二、刷机 系统启动和初始化配置 2.1 需要的工具&#xff1a; 2.2 工具安装&#xff1a; 2.3 刷机&#xff1a; 2.4 登录系统&#xff1a; 2.5 修改登录密码…

Prometheus:开源监控解决方案的力量

前言 在当今高度数字化和云原生应用的时代&#xff0c;监控系统是确保系统稳定性和性能的关键组成部分。而 Prometheus 作为一种开源的监控解决方案&#xff0c;正在成为越来越多企业和开发者的首选。本文将深入探讨 Prometheus 的特性、优势以及如何利用它来构建强大的监控系…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…