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

❣博主主页: 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进行网络编程,我们要掌握客户端与服务器的各个流程.

下期预告:网络原理

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

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

相关文章

18 【Aseprite 作图】描边 换颜色 蒙版

1 描边的方式:选择“编辑 - 特效 - 轮廓” 就可以一键描边了 2 替换颜色 通过“编辑 - 替换颜色”,就把颜色从黄色 替换成了 紫色 3 调整色相,通过“编辑 - 调整 - 色相/饱和度”,就可以类似PS调整色相饱和度 4 铅笔选择“锁…

vue+springboot用户注销功能

vue文件前端 <el-button type"warning" plain click"handleDeletion">注 销</el-button> // 注销 const handleDeletion (userName) > {ElMessageBox.confirm(注销该用户所有信息后无法恢复&#xff0c;您确认注销吗?, 注销确认, { type…

【eclipse】如何在IDE里创建一个Java Web项目?

如何在eclipse中创建一个动态Web项目并成功运行&#xff1f; 一、 最终效果 懒得写那么多了…我也不知道该怎么写了&#xff0c;有点乱&#xff0c;有问题可以在评论里留言&#xff0c;我看到会解决的&#xff0c;在这个过程中也踩到了一些坑&#xff0c;但好在有CSDN帮助解决…

【VTKExamples::Rendering】第十一期 TestStringToImageDemo

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享TestStringToImageDemo,该样例用于将字符转化为Image,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…

YOLOv8独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv8结合:替代YOLOv8的backbone 收录 YOLOv8…

Qt---文件系统

一、基本文件操作 1. QFile对文件进行读和写 QFile file( path 文件路径) 读&#xff1a; file.open(打开方式) QlODevice::readOnly 全部读取->file.readAll()&#xff0c;按行读->file.readLine()&#xff0c;atend()->判断是否读到文件尾 …

贪心算法----最大数

今日题目&#xff1a;leetcode179------点击跳转题目 分析&#xff1a; 要把这些数组组成最大的数&#xff0c;首先我们把数字转化为字符串&#xff0c;根据自定义的排序规则把这些字符串字数排列&#xff0c;再用一个字符串接受这些字符串数字拼接成最大的字符串数字 排序规则…

UniGen:用于生成自动驾驶场景的初始智体状态和轨迹的统一建模

24年5月谷歌WayMo论文“UniGen: Unified Modeling of Initial Agent States and Trajectories for Generating Autonomous Driving Scenarios”。 本文介绍 UniGen&#xff0c;一种生成交通场景的新方法&#xff0c;用于通过仿真评估和改进自动驾驶软件。 其方法在一个统一的模…

探索大语言模型代理(Agent):研究背景、通用框架与未来展望

引言 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在智能代理&#xff08;Agent&#xff09;领域中的应用已成为研究的热点。这些代理不仅能够模拟人类的认知过程&#xff0c;还能在复杂的社会环…

智慧畜牧:RFID技术在现代屠宰场的应用

智慧畜牧&#xff1a;RFID技术在现代屠宰场的应用 RFID猪肉溯源管理解决方案是一种利用无线射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术来实现猪肉从养殖、屠宰到销售整个供应链过程中的追踪与追溯的现代化管理手段。这一方案通…

【class】人工智能初步(了解深度学习)

任务二&#xff1a;对电脑图像的智能识别和自动分类之前 在实现对电脑图像的智能识别和自动分类之前&#xff0c;本节课我们先学习两个知识点&#xff1a;1. 计算机如何看世界&#xff1f; 揭秘计算机眼中的图像2. 计算机如何理解世界&#xff1f; 揭秘图像识别、深度学习 计…

图像质量评价指标:了解图像质量的度量方式

图像质量评价指标&#xff1a;了解图像质量的度量方式 在图像处理和计算机视觉领域&#xff0c;评价图像质量的准确性对于许多应用至关重要。通过合适的评价指标&#xff0c;我们可以量化图像的质量&#xff0c;从而更好地了解图像处理算法的效果和改进空间。本文将介绍图像质…

单链表经典算法OJ题---力扣21

1.链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a;创建新的空链表&#xff0c;遍历原链表。将节点值小的节点拿到新链表中进行尾插操作 遍历的结果只有两种情况&#xff1a;n1为空 或 n2为空 注意&#xff1a;链表为空的情况 代…

程序员的神奇应用:从代码创造到问题解决的魔法世界之持续集成/持续部署

文章目录 持续集成/持续部署 在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。 在当今数字化的世界里&…

GEE获取年均LAI(叶面积指数)和FPAR(光合有效辐射分量)

MODIS/061/MOD15A2H 组合了叶面积指数 (LAI) 和光合有效辐射分数 (FPAR) 产品是分辨率为 500m 的 8 天复合数据集。该算法从Terra传感器8天内的所有采集数据中选择了“最佳”像元。 var table ee.FeatureCollection("users/yipeizhao736/HefeiProvince"); var coll…

【C++初阶】第十一站:list的介绍及使用

目录 list的介绍及使用 1.list的含义 2.list的介绍 3.list的使用 1.list的构造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾删 和 头插头删 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

设计一个游戏的基本博弈框架

设计一个游戏的基本博弈框架&#xff0c;玩家通过操作改变某个数值&#xff0c;这个数值的变动会引发一系列实时变化&#xff0c;并且当这些数值累计到特定阈值时&#xff0c;会导致游戏中出现其他变化&#xff0c;可以分为以下几个步骤&#xff1a; 1. 确定游戏类型和主题 首…

GH263-045、GH263-035比例阀用电磁铁驱动放大器

GH263-045、GH263-035比例阀用电磁铁用于比例变量泵和油马达的控制&#xff0c;通过改变比例阀芯位置&#xff0c;可实现对比例变量泵的输出流量或油马达 转矩和转速的无级调节和远程控制&#xff0c;驱动电流分为GH263-035&#xff08;0.68A&#xff09;/GH263-045&#xff08…

未授权访问:Docker未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、通过crontab反弹宿主机shell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好…

五、Linux二进制安装MariaDB 六、MariaDB主从复制

目录 五、Linux二进制安装MariaDB1 卸载mariadb1.1 卸载相关的服务(mysql和mariadb都查询一下)1.2 查找MySQL和mariadb相关的文件目录 2 安装mariadb2.1 mariadb下载地址2.2 将安装包放入到服务器中并解压 (我放到opt下)2.3 将解压后的目录移动到安装目录下2.4 创建数据目录(根…