【JavaEE 初阶(六)】网络编程

news2025/4/17 4:11:12

❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多网络知识

在这里插入图片描述

目录

  • 1.前言
  • 2.浅谈网络
    • 2.1基本知识
    • 2.2.OSI与TCP/IP
  • 3.网络编程
    • 3.1TCP与UDP区别
    • 3.2UDP网路编程
    • 3.3TCP网络编程
  • 4.总结

1.前言

在日常生活中,我们处处都需要用到网络,比如我们在自己的电脑上编辑一条信息是如何发送到对方的电脑上的呢?我相信通过对网络的学习大家一定有不少的收获。

2.浅谈网络

2.1基本知识

网络的发展:单机时代-局域网时代-广域网时代-移动互联网时代
局域网:把几个电脑通过一个路由器连接到一起
广域网:把更多的局域网连接在在一起
IP地址:描述了一台设备在网络上的地址
端口号:不同程序关联了不同的端口号,一个端口号只能绑定一个程序但是一个程序可以绑定多个端口号。
协议:一种约定
五元组:源IP地址,目的IP地址,源端口号,目的端口号,协议类型
协议分层:如果搞一个大的协议来解决所有问题,那么这个协议就会非常的胖达,所以我们就进行拆分,由于通信实在太复杂,拆分出来的小协议就非常多,所以就进行了分层,约定了不同层次之间的调用关系,上层协议调用下层协议,下层协议给上层协议提供支持。

2.2.OSI与TCP/IP

OSI七层网络模型仅仅是在教科书中出现,在日常的生活中并不常见。TCP/IP五层网络协议是七层网络模型的简化版本。
在这里插入图片描述
1.物理层:描述的是通信网络的硬件设备,例如网线或者光纤。
2.数据链路层:两个相邻节点的传输情况,负责设备之间的数据帧的传送和识别。
3.网络层:进行路径规划,负责地址管理和路由选择。
4.传输层:关注起点和终点,负责两台主机之间的数据传输。
5.应用层:如何使用这个数据
注意

  • 对于一台主机,它实现了从物理层到应用层,5层
  • 对于一台路由器,它实现了物理层到网络层,3层
  • 对于一台交换机,它实现了从物理层到数据链路层,2层
    对于集线器,只实现物理层

3.网络编程

通过网络,可以让两个主机进行通信。进行网络编程的时候,需要操作系统提供API,这组API其实就是Socket API可以认为是应用层和传输层之间交互的路径。通过这组API就可以完成不同主机,不同系统之间的通信。

3.1TCP与UDP区别

传输层提供了2个协议是:TCP和UDP,那有什么区别呢?
TCP是有连接的,UDP是无连接的:TCP保存了对方信息,UDP没有保存
TCP是可靠的,UDP是不可靠的:TCP消息发出能够知道是否到达,UDP不知道。
TCP是面向字节流,UDP是面向数据报:TCP以字节为单位传输,UDP以数据报为单位进行传输
TCP和UDP都是全双工:允许双向通信

3.2UDP网路编程

让客户短发送一个请求,服务器收到请求以后返回发给客户端,再显示:
服务器:

package UDP;

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

public class UdpEchoServer {
    DatagramSocket socket=null;
    //设置端口号
    public UdpEchoServer(int port) throws SocketException {
        socket=new DatagramSocket(port);
    }
    //启动服务器
   public void start() throws IOException {
       System.out.println("启动服务器");
       while (true){
           //1、读取请求解析
           DatagramPacket requestpacket=new DatagramPacket(new byte[4096],4096);
           socket.receive(requestpacket);
           //此时数据是以二进制的形式存放早数组中,将其以字符串形式显示
           String request=new String(requestpacket.getData(),0,requestpacket.getLength());
           //2.响应
           String response=process(request);
           //3.响应回到客户端
           DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestpacket.getSocketAddress());
           socket.send(responsePacket);
           //4.打印日志

           System.out.printf("[%s:%d] req=%s, resp=%s\n",requestpacket.getAddress().toString(),requestpacket.getPort(),request,response);
       }
   }

    private String process(String request) {
        return request;
    }
    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer=new UdpEchoServer(9090);
        udpEchoServer.start();

    }
}

客户端:

package UDP;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UdpEchoClient {
     DatagramSocket socket=null;
    String ip="";
    int port=0;
    public UdpEchoClient(String ip,int port) throws SocketException {
        socket=new DatagramSocket();
        this.ip=ip;
        this.port=port;
    }
    //客户端启动
    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
        while (true){
            System.out.println("->");
            //控制台输入数据作为请求
            String request=scanner.next();
            //发送请求
            DatagramPacket requestpacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);
            socket.send(requestpacket);
            //读取响应
            DatagramPacket responsepacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsepacket);
            //打印响应
            String response=new String(responsepacket.getData(),0,responsepacket.getLength());
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();
    }
}

3.3TCP网络编程

客户端:

package TCP;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    Socket socket=null;
    public TcpEchoClient(String IP,int port) throws IOException {
        socket=new Socket(IP,port);
    }
    //服务器启动
    public void start(){
        System.out.println("客户端启动!");
        Scanner scanner=new Scanner(System.in);
        try (InputStream inputStream=socket.getInputStream();
             OutputStream outputStream=socket.getOutputStream()) {
             PrintWriter writer=new PrintWriter(outputStream);
             Scanner scannernet=new Scanner(inputStream);
            while (true){
                System.out.println("->");
                String request=scanner.next();
                //发送请求
                writer.println(request);
                writer.flush();
                //读取响应
                String response=scannernet.next();
                //打印响应
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient=new TcpEchoClient("127.0.0.1",9090);
        tcpEchoClient.start();
    }
}

服务器:

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoServer {
    ServerSocket socket=null;
    public TcpEchoServer(int port) throws IOException {
        socket=new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
        Socket clientsocket= socket.accept();
        Thread t=new Thread(()->{
               processConnection(clientsocket);
       });
        t.start();
        }
    }
    private void processConnection(Socket clientsocket)  {
        //服务器启动
        System.out.printf("[%s:%d] 客户端上线\n",clientsocket.getInetAddress(),clientsocket.getPort());
            try (InputStream inputStream=clientsocket.getInputStream();
                 OutputStream outputStream=clientsocket.getOutputStream()) {
                //连接请求分析
                while (true) {
                    Scanner scanner = new Scanner(inputStream);
                    if (!scanner.hasNext()) {
                        System.out.printf("[%s:%d] 客户端下线\n", clientsocket.getInetAddress(), clientsocket.getPort());
                        break;
                    }
                    String request = scanner.next();
                    //做出响应
                    String response = process(request);
                    //发送给客户端
                    PrintWriter writer = new PrintWriter(outputStream);
                    writer.println(response);
                    writer.flush();
                    //打印以下交互过程
                    System.out.printf("[%s:%d],req=%s,rep=%s\n", clientsocket.getInetAddress(), clientsocket.getPort(), request, response);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    clientsocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
    private String process(String request) {
        return request;
    }
    public static void main(String[] args) throws IOException {
        TcpEchoServer tcpEchoServer=new TcpEchoServer(9090);
        tcpEchoServer.start();
    }
}

4.总结

本篇文章主要讲述了利用UDP和TCP进行网络编程,我们要掌握客户端与服务器的各个流程.

下期预告:网络原理

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

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

相关文章

static成员变量、static成员方法、静态成员变量初始化

static修饰成员变量 引入:我们设置一个学生类的场景,实例化三个学生对象,每个对象都有自己特有的名字,性别,年龄,成绩等,如下: 这些在Student类中定义的成员变量,每个对…

Docker和Kubernetes之间的关系

Docker和Kubernetes在容器化生态系统中各自扮演着不同的角色 它们之间是互补的,而不是替代关系。 Docker是一个开源的容器化平台,它允许开发人员将应用程序及其依赖项打包到一个可移植的容器中,并确保这些容器可以在任何Docker环境中一致地…

LeetCode 力扣题目:买卖股票的最佳时机 IV

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

Windows电脑使用Docker安装AList网盘神器并配置公网地址打造私人云存储空间

文章目录 前言1. 使用Docker本地部署Alist1.1 本地部署 Alist1.2 访问并设置Alist1.3 在管理界面添加存储 2. 安装cpolar内网穿透3. 固定Alist公网地址 前言 本文和大家分享如何在Windows系统使用Docker本地部署Alist全平台网盘神器,然后结合cpolar内网穿透工具实现…

linux性能监控之lsof

lsof:list open files,显示所有打开的文件以及进程信息,我们通常用来检查特定的文件被哪些进程打开 [rootk8s-master ~]# lsof --help lsof: illegal option character: - lsof: -e not followed by a file system path: "lp" lso…

React 第三十二章 虚拟DOM

面试题:什么是虚拟DOM?其优点有哪些? 标准且浅显的答案 虚拟dom本质上就是一个普通的 JS 对象,用于描述视图的界面结构 虚拟 DOM 最早是由 React 团队提出来的,因此 React 团队在对虚拟 DOM 的定义上面有绝对的话语权。…

object.key()用法

object.key(obj) 一、概念:返回一个由一个给定对象的自身可枚举属性组成的数组。 二、用法: 1、参数为对象:则返回为 对象属性名组成的数组。 let obj {日期:date,姓名:userName,地址:address}console.log(Object.k…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中,提升用户体验一直是开发者们追求的目标之一。其中,一个常见的场景就是在用户与应用程序进行交互时,特别是当进行异步操作时(如网络请求),为用户提供即时的反馈,避免用户因…

Linux软件RAID:数据冗余与性能提升的完美融合

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、软件RAID的概念 2、软件RAID与硬件RAID的对比…

中电金信:专题报告·商业银行对公数字化转型体系架构及实践拆解

当今,数字化转型已然成为商业银行发展的关键动力,在这个数字时代,对公业务数字化转型更是势在必行。 基于此,中电金信发布《商业银行对公数字化转型专题报告》(简称《报告》),针对对公数字化转型…

揭秘四川古力未来科技抖音小店:创新优势引领电商新风潮

在当下这个数字化、网络化的时代,电商行业正以前所未有的速度迅猛发展,而抖音小店作为其中的佼佼者,凭借其独特的平台优势和创新的经营模式,吸引了越来越多的消费者和商家。其中,四川古力未来科技抖音小店凭借其显著的…

R语言:肿瘤突变负荷分析

> merge_maf <- function(metadata, path){ #通过合并path,还有sample sheet前两列得到每一个文件的完整路径 filenames <- file.path(path, metadata$file_id, metadata$file_name, fsep .Platform$file.sep) message (##############…

MyBatis——MyBatis查询语句

一、返回Car 当查询的结果&#xff0c;有对应的实体类&#xff0c;并且查询结果只有一条时&#xff1a; &#xff08;查询结果只有一条也可以用 List 集合接收&#xff09; package org.qiu.mybatis.mapper;import org.qiu.mybatis.pojo.Car;/*** author 秋玄* version 1.0*…

WHAT - 支持小程序的跨端框架(一)

一、背景 在 WHAT - Hybrid App 详解系列&#xff08;一&#xff09; 中我们介绍过 React Native、weex 以及 flutter 等跨平台开发技术。 随着微信小程序、百度小程序、支付宝小程序、字节跳动小程序、快应用等场景的流行&#xff0c;支持小程序或快应用的跨端诉求也促进了一…

【HarmonyOS】综合应用-《校园通》

概念 本文结合之前的笔记文章知识点&#xff0c;做一个综合性的小应用。 创建一个ArkTS语言的鸿蒙项目&#xff0c;搭建首页面 其界面代码如下&#xff0c;该界面使用了垂直布局&#xff0c;相对布局&#xff0c;轮播布局&#xff0c;以及图片&#xff0c;文本等组件的综合运…

Python API和微服务的测试库之httpretty使用详解

概要 在现代软件开发中,API和微服务的测试是确保应用稳定性和功能正确性的关键环节。Python的HTTPretty库提供了一个强大的工具,允许开发者在不实际发起网络请求的情况下模拟HTTP请求和响应。本文将全面介绍HTTPretty的安装、特性、基本与高级功能,并结合实际应用场景,展示…

Leetcode—287. 寻找重复数【中等】(快慢指针算法)

2024每日刷题&#xff08;136&#xff09; Leetcode—287. 寻找重复数 快慢指针算法思想 low fast 时&#xff0c;快慢指针相遇&#xff0c;low 走过的距离是初始点&#xff08;0&#xff09;到环状开始的点 &#xff08;x&#xff09; 加上 环状开始的点&#xff08;x&…

如何规划数据中台

1. 数据中台是一套解决方案 在数聚看来&#xff0c;数据中台是一套可持续“让企业数据用起来”的机制&#xff0c;是一套解决方案&#xff0c;不仅是一个平台。让数据更加灵活地支撑前端业务&#xff0c;通过持续沉淀企业数据复用能力形成数据从采集、治理、开发到数据服务的一…

运维安全管理系统:“四集中”管理 解决迫切问题

日前&#xff0c;国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业——国联易安依托自身强大的研发能力&#xff0c;丰富的行业经验&#xff0c;自主研发了新一代软硬件一体化统一安全运维平台——国联易安…

leetcode.环形链表问题

目录 题目1 示例 解题思路 代码实现 补充 题目2 示例 解题思路 代码实现 题目1 该题链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle/description/ 示例 解题思路 要创建两个指针一个是快指针(fast)&#xff0c;另一个慢指针(slow)。快指针走两步慢指…