Java网络编程:概述--快速入门

news2024/10/3 3:50:54

I. 介绍

   1.1 什么是网络编程


      - 网络编程是指通过计算机网络实现程序之间的通信。在Java中,网络编程通常涉及到数据的传输、通信协议的使用以及与网络相关的各种操作。

  1.2. 为什么学习Java网络编程


      - Java网络编程是Java开发者重要的技能之一,因为它允许应用程序通过网络进行数据交换,实现分布式系统和网络通信。学习网络编程可以帮助开发者构建强大的、具有高度互联性的应用。

  1.3. Java在网络编程中的角色


      - Java在网络编程中扮演着多个角色,包括作为服务器和客户端,使用Socket实现基本的通信,以及通过高级抽象层如HTTPURLConnection处理Web请求。Java还提供了NIO和WebSocket等技术,使网络编程更加灵活和高效。网络安全与加密也是Java网络编程中的重要方面,以确保数据的安全传输。

2. 基础知识

  2.1 OSI模型概述


      - OSI模型将计算机网络通信分为七个层次,每个层次负责特定的功能。物理层处理硬件传输和物理连接,数据链路层处理数据帧的传输,网络层负责路由和包转发,传输层提供端到端的可靠传输,会话层管理会话和对话,表示层处理数据的格式和编码,应用层提供用户接口和网络服务。

  2.2. TCP/IP协议


      - TCP/IP协议是一组用于互联网通信的协议。其中,TCP协议提供可靠的、面向连接的数据传输,而IP协议负责数据包的路由和定位。这组协议是互联网通信的基础,允许不同计算机在全球范围内进行数据交换。

TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。

应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动

     2.2.1 传输控制协议TCP(Transmission Control Protocol) 

        ①安全可靠的传输协议;

        ②每次传输数据时,先与服务器通过“三次握手”建立连接;

        ③保证网络通畅,然后再进行数据传输,在连接中可进行大数据量的传输;

        ④断开时进行“四次挥手”,保证客户端和服务器都知情;

        ⑤因为要建立连接,所以传输速率相比于UDP速率慢。

        ⑥TCP协议进行通信的两个应用进程:客户端、服务端。

2.2.2 IP协议 

IP(互联网协议)是一种网络层协议,负责在网络中定位和路由数据包。IPv4和IPv6是两个主要版本,其中IPv6解决了IPv4地址枯竭的问题。IP协议通过在数据包头部添加源和目标地址,使得数据包能够在网络中正确传递。

0 ~ 1024 未被系统使用或保留的端口号,0 ~ 65535为有效的端口号, 也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范围内的整数数字。例如:Tomcat占用8080端口

 2.3 Socket概念


      - Socket是一种通信的端点,用于实现网络上不同计算机之间的数据传输。在Java中,Socket编程是通过Socket类来实现的。服务器端使用ServerSocket监听客户端的连接请求,而客户端使用Socket建立与服务器的连接,通过Socket进行数据传输。

2.4 URL和URI的区别


      - 统一资源标识符(URI)是用于标识资源的字符串,而统一资源定位符(URL)是URI的一种具体类型。URL不仅标识资源,还提供了定位该资源的手段,包括协议、主机名、端口号和路径等信息。因此,URL是URI的子集,URL可用于定位和访问网络上的资源。

3. Java Socket编程

   3.1 Socket基础


      1. 创建Socket
         - 在Java中,通过使用`Socket`类可以创建Socket实例。以下是一个简单的例子:

    Socket clientSocket = new Socket("server_ip", 8080);

      2. 服务器端Socket
         - 服务器使用`ServerSocket`类来监听客户端的连接请求。以下是服务器端Socket的简单示例代码:

ServerSocket serverSocket = new ServerSocket(8080);
         Socket clientSocket = serverSocket.accept();

      3. 客户端Socket
         - 客户端使用`Socket`类连接到服务器。以下是客户端Socket的简单示例代码:

Socket clientSocket = new Socket("server_ip", 8080);

   3.2 Socket通信


      1. **TCP通信**
         - TCP是一种面向连接的协议,以下是使用TCP进行通信的简单示例代码:

         // 服务器端
         ServerSocket serverSocket = new ServerSocket(8080);
         Socket clientSocket = serverSocket.accept();

         // 客户端
         Socket clientSocket = new Socket("server_ip", 8080);

      2. **UDP通信**
         - UDP是一种无连接的协议,以下是使用UDP进行通信的简单示例代码:

         // 服务器端
         DatagramSocket serverSocket = new DatagramSocket(9876);

         // 客户端
         DatagramSocket clientSocket = new DatagramSocket();

   C. **Socket编程实例**
      - 下面是一个简单的Socket编程实例,演示了一个基于TCP的服务器和客户端之间的通信:

      // 服务器端
      try {
          ServerSocket serverSocket = new ServerSocket(8080);
          Socket clientSocket = serverSocket.accept();

          // 输入流
          BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
          String clientMessage = in.readLine();
          System.out.println("Client says: " + clientMessage);

          // 输出流
          PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
          out.println("Hello from server!");

          // 关闭连接
          in.close();
          out.close();
          clientSocket.close();
          serverSocket.close();
      } catch (IOException e) {
          e.printStackTrace();
      }

      // 客户端
      try {
          Socket socket = new Socket("server_ip", 8080);

          // 输出流
          PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
          out.println("Hello from client!");

          // 输入流
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          String serverMessage = in.readLine();
          System.out.println("Server says: " + serverMessage);

          // 关闭连接
          out.close();
          in.close();
          socket.close();
      } catch (IOException e) {
          e.printStackTrace();
      }

      这个完整的例子演示了服务器端和客户端的输入输出流的使用,以及在通信结束后关闭连接。

4. HTTP协议与URLConnection

  4.1 HTTP基础


      - HTTP(超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。它是无状态的,采用请求-响应模型。了解HTTP协议对于在Web开发中进行网络通信至关重要。

   4.2 Java中的HTTPURLConnection


      - `HttpURLConnection`是Java中用于发送HTTP请求和处理HTTP响应的类。它是`URLConnection`的子类,提供了更方便的HTTP操作接口。

   4.3 发送GET和POST请求


      - 通过`HttpURLConnection`可以轻松发送GET和POST请求,以下是简单的示例代码:

      // 发送GET请求
      URL url = new URL("https://example.com/api/resource");
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setRequestMethod("GET");

      // 读取响应
      BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      String line;
      StringBuilder response = new StringBuilder();
      while ((line = reader.readLine()) != null) {
          response.append(line);
      }
      reader.close();

      // 发送POST请求
      URL postUrl = new URL("https://example.com/api/resource");
      HttpURLConnection postConnection = (HttpURLConnection) postUrl.openConnection();
      postConnection.setRequestMethod("POST");
      postConnection.setDoOutput(true);

      // 写入POST数据
      OutputStream outputStream = postConnection.getOutputStream();
      outputStream.write("post_data=example".getBytes());
      outputStream.flush();
      outputStream.close();

      // 读取POST响应
      BufferedReader postReader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
      StringBuilder postResponse = new StringBuilder();
      String postLine;
      while ((postLine = postReader.readLine()) != null) {
          postResponse.append(postLine);
      }
      postReader.close();

      这是一个简单的HTTP请求和响应的例子,实际应用中可能需要处理更多的细节和异常。

参考文章:

https://blog.csdn.net/allenfoxxxxx/article/details/90707505

https://blog.csdn.net/m0_58450531/article/details/125781027

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

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

相关文章

git切换到另一分支更改也会随之过去

一次的修改如果没有 commit如果切换到另一分支就会把修改带到另一个分支 这时可以使用 git stash 其他使用场景 切换分支:当正在一个分支上工作,但需要临时切换到另一个分支处理一些紧急任务时,可以使用 git stash 保存当前的工作进度。完成…

奇安信 天擎 rptsvr 任意文件上传漏洞

产品介绍 奇安信天擎终端安全管理系统是面向政企单位推出的一体化终端安全产品解决方案。该产品集防病毒、终端安全管控、终端准入、终端审计、外设管控、EDR等功能于一体,兼容不同操作系统和计算平台,帮助客户实现平台一体化、功能一体化、数据一体化的…

Java数据结构之排序(头歌平台,详细注释)

第1关:选择排序 任务描述 给定一组无序的数据,如果要把它们从小到大重新排序,我们要如何实现这个排序功能呢? 本关任务:实现选择排序。 相关知识 选择排序(Selection sort)是一种简单直观的排序…

【MATLAB基础绘图第19棒】绘制小提琴图

MATLAB绘制小提琴图 小提琴图(Violin Plot)案例1:基础绘制参考 小提琴图(Violin Plot) 小提琴图(Violin Plot)可用于展示多组数据的分布状态和概率密度。 出自论文-J2020-Drought hazard trans…

蓝桥杯每日一题---基数排序

题目 分析 在实际的比赛过程中很少会自己手写排序,顶多是定义一下排序规则。之所以要练习一下基数排序,是因为在后续学习过程中学到后缀数组时需要自己手写基数排序,那么这里使用的方法也和后缀数组一致,理解这里也便于后缀数组的…

我的最大收获与成长

经历 I am not a designer nor a coder. Im just a guy with a point-of-view and a computer. 翻译:俺不是码畜,俺只是一条对着电脑有点想法的土木狗。 笔者1982年出生,西南交通大学渣硕,目前仍在土木行业(PS&#xf…

SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动

目录 一、问题 二、原因 1、修改配置 2、添加Lazy注解在client上面 3、启动成功 一、问题 当在gateway的全局过滤器GlobalFilter中注入OpenFeign接口的时候会一直卡在路由中,但是不会进一步,导致启动未成功也未报错失败 2024-01-18 22:06:59.299 I…

vue基于spring boot框架的发艺美发店理发店管理系统的设计q9xpe

店铺信息、美发信息是发艺美发店管理系统的重要组成部分,信息清晰、详细、准确,能够有效地促进发艺美发店管理系统的运行[5]。基础设定函数是对整个系统的总体布局进行合理安排,包括:店铺活动、物品信息、领用信息等。通过对各类资…

手写webpack的loader

一、概念 帮助webpack将不同类型的文件转换为webpack可识别的模块。 二、Loader执行顺序 分类 pre:前置loadernormal:普通loaderinline:内联loaderpost:后置loader 执行顺序 4类loader的执行顺序为per>normal>inline&…

C++--默认参数

一.默认参数🍗 C中允许函数提供默认参数,也就是允许在函数的声明或定义时给⼀个或多个参数指定默认值。在调 ⽤具有默认参数的函数时,如果没有提供实际参数,C将⾃动把默认参数作为相应参数的值。 二.使用规则🍗 1.如果…

【Spring源码分析】从源码角度去熟悉依赖注入(一)

从源码角度去熟悉依赖注入 一、全局出发引出各种依赖注入策略二、Autowired依赖注入源码分析属性注入源码分析(AutowiredFieldElement.inject)方法注入源码分析(AutowiredMethodElement.inject)流程图 其实在上篇阐述非懒加载单例…

SpringBoot SaToken Filter如用使用ControllerAdvice统一异常拦截

其实所有的Filter都是一样的原理 大致流程: 创建一个自定义Filter, 用于拦截所有异常此Filter正常进行后续Filter调用当调用后续Filter时, 如果发生异常, 则委托给HandlerExceptionResolver进行后续处理即可 以sa-token的SaServletFilter为例 首先注册SaToken的过滤器 pac…

虚拟化网络

vm1和vm2通过虚拟交换机与主机进行交换, 虚拟交换机:(通过软件虚拟出来的交换机) 1、LinuxBridge虚拟交换机 2、OVS(Open Virtual Switch)虚拟交换机 虚拟机的传输是通过虚拟交换机,然后连到…

zabbix监控平台(agent端)

引言:明人不说暗话,上一篇文章我们讲了zabbix的serrver端部署和配置,今天详细讲解一下agent端服务器(客户端)的配置和关联 1.进入官网 Zabbix:企业级开源监控解决方案 2.进入下载页面选择需要下载的版本信…

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN Matlab语言…

C++大学教程(第九版)5.19求Π的值

题目 代码 #include <bits/stdc.h> using namespace std;int main() {double pai 0;for (int count 1, i 1; count < 1000; i 2, count){int flag 1;if (count % 2 0){flag -1;}pai flag * (4.0 / (i * 1.0));cout << "当取前" << co…

前端项目配置 Dockerfile 打包后镜像部署无法访问

Dockerfile 配置如下&#xff1a; FROM node:lts-alpineWORKDIR /app COPY . . RUN npm install RUN npm run buildEXPOSE 3001CMD ["npm", "run", "preview"]构建镜像 docker build -t vite-clarity-project .启动镜像容器 docker run -p 30…

什么牌子的洗地机质量好?洗地机推荐榜

随着时代的进步&#xff0c;清洁家电市场蓬勃发展&#xff0c;懒人经济盛行&#xff0c;许多人对做家务的热情下降。面对繁重的家务活&#xff0c;人们感到无从下手。近年来&#xff0c;洗地机的出现为懒人提供了理想的解决方案。在年货节的氛围中&#xff0c;笔者整理了一些质…

REVIT二次开发生成三维轴网

步骤1 确定轴网 步骤2 生成3D轴网 using System; using System.Collections.Generic; using System.Linq; using System.Text;

【从零开始学习Redis | 第七篇】利用Redis构造全局唯一ID(含其他构造方法)

目录 前言&#xff1a; 什么是全局唯一ID&#xff1f; 尝试构造全局唯一ID&#xff1a; 其他构造全局唯一ID的方法 1.基于数据库自增构造全局唯一ID&#xff1a; 2.基于UUID构造全局唯一ID&#xff1a; 3.基于雪花算法构造全局唯一ID&#xff1a; 总结&#xff1a; 前…