Java基础_网络编程

news2024/9/25 19:21:19

Java基础_网络编程

  • 网络编程三要素
    • InetAddress
    • 网络模型
  • UDP通信程序
    • 单播
      • 发送数据
      • 接收数据
      • 聊天室
    • 组播
    • 广播
  • TCP
    • TCP通信程序
    • 三次握手和四次挥手
  • 来源
  • Gitee地址

网络编程三要素

  • IP: 设备在网络中的地址,是唯一的标识
  • 端口号: 应用程序在设备中唯一的标识。
  • 协议: 数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

InetAddress

public class demo {
    public static void main(String[] args) throws UnknownHostException {
        /**
         * static InetAddress getByName(String host)  确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
         * String getHostName()                       获取此IP地址的主机名
         * String getHostAddress()                    返回文本显示中的IP地址字符串
         */

        // 1. 获取InetAddress的对象
        InetAddress address = InetAddress.getByName("cen");
        System.out.println(address);

        String hostName = address.getHostName();
        System.out.println(hostName); // cen

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress); // 192.168.174.1
    }
}

网络模型

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

在这里入图片描述

UDP通信程序

单播

发送数据

public class Demo {
    public static void main(String[] args) throws IOException {
        /**
         * udp发送数据
         */

        // 1. 创建DatagramSocket对象
        // 绑定发送端口
        // 空参: 所有可用端口中随机一个进行使用
        // 有参: 指定端口
        DatagramSocket ds = new DatagramSocket();

        // 2. 打包数据
        String str = "Hello Socket!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        // 3. 发送数据
        ds.send(dp);

        // 4. 释放资源
        ds.close();

    }
}

接收数据

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        /**
         * udp接收数据
         */

        // 1. 创建DatagramSocket对象
        // 接收时要绑定端口
        DatagramSocket ds = new DatagramSocket(10086);

        // 2. 接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);

        // 3. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();

        System.out.println("接收到数据: " + new String(data, 0, len));
        System.out.println("该数据是从" + address + "的" + port + "端口发出的");

        // 4. 释放资源
        ds.close();
    }
}

聊天室

// SendDemo
public class SendDemo {
    public static void main(String[] args) throws IOException {
        /**
         * udp循环发送数据, 直到输入886, 停止发送
         */

        DatagramSocket ds = new DatagramSocket();

        Scanner sc = new Scanner(System.in);
        // 循环发送数据
        while(true) {
            String str = sc.nextLine();
            if(str.equals("886")){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10086;

            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

            ds.send(dp);

        }
        ds.close();

    }
}

// ReceiveDemo
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        /**
         * udp循环接收数据
         */

        DatagramSocket ds = new DatagramSocket(10086);


        while(true) {
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);

            byte[] data = dp.getData();
            int len = dp.getLength();
            InetAddress address = dp.getAddress();
            int port = dp.getPort();

            System.out.println("接收到数据: " + new String(data, 0, len));
            System.out.println("该数据是从" + address + "的" + port + "端口发出的");
        }
    }
}

组播

  • 组播地址: 224.0.0.0 ~ 239.255.255.255, 其中224.0.0.0 ~ 224.0.0.255为预留的组播地址
// Send
public class SendDemo {
    public static void main(String[] args) throws IOException {
        /**
         * 组播发送
         */

        // 1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket();

        // 2. 创建DatagramPacket对象
        String str = "Hello MultiSocket!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10000;

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        // 3. 发送数据
        ms.send(dp);

        // 4. 释放资源
        ms.close();
    }
}

// Receive
public class ReveiveDemo1 {
    public static void main(String[] args) throws IOException {

        MulticastSocket ms = new MulticastSocket(10000);

        // 将当前本机添加到 224.0.0.1
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        // 2. 接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        ms.receive(dp);

        // 3. 解析数据
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

        System.out.println("接收到数据: " + new String(data, 0, len));
        System.out.println("该数据是从" + name + "/" + ip + "发出的");

        // 4. 释放资源
        ms.close();
    }
}

广播

将单播程序发送的ip地址改为255.255.255.255就是广播

TCP

TCP通信程序

// Client
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        /**
         * tcp发送数据
         */

        // 1. 创建Socket对象
        // 创建对象的同时会连接服务端, 如果连接不是, 代码会报错
        Socket socket = new Socket("127.0.0.1", 10000);

        // 2. 可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        // 写出数据
        os.write("Hello TCP连接!".getBytes());

        // 3. 释放资源
        os.close();
        socket.close();
    }
}

// Server
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        /**
         * tcp接收数据
         */
        // 1. 创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10000);

        // 2. 监听客户端的连接
        Socket socket = ss.accept();

        // 3. 从连接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        int b;
        while( (b = br.read()) != -1 )
        {
            System.out.print((char) b);
        }

        // 4. 释放资源
        socket.close();
        ss.close();
    }
}
  • 中文乱码: 将字节流通过转换流转换成字符流
  • 提高效率: 转成缓冲流
  • 输入输出流可以无需手动关闭, 因为流是在连接通道里的, 连接断开后, 流也就关闭了
  • 连接关闭时的协议: 四次挥手, 利用四次挥手协议断开连接, 可以保证连接连接通道里的数据已经处理完毕了.

三次握手和四次挥手

  • 三次握手 - 确保连接建立
    1. 客户端向服务器发出连接请求, 等待服务器确认
    2. 服务器向客户端返回一个响应, 告知客户端收到了请求
    3. 客户端向服务器再次发出确认信息, 连接建立
  • 四次挥手 - 确保连接断开, 且数据处理完毕
    1. 客户端向服务器发出取消连接请求
    2. 服务器向客户端返回一个响应, 表示收到客户端取消请求
    3. 服务器将最后的数据处理完毕后, 服务器向客户端发出确认取消信息
    4. 客户端再次发送确认消息, 连接取消

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

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

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

相关文章

2023OpenFeign源码

原理-源码 让我们看着源~码~ 按顺序走~趟流~程~ 分为两大部分:启动原理、调用流程 Feign 的Java 代码才 3w 多行,放眼现在热门的开源项目, Dubbo、Naocs、Skywalking 中 Java 代码都要 30w 行起步。 重要通知!看源码,…

Winform制作的用户界面在高DPI下缩放问题

引言 熟悉Winform的小伙伴应该都遇到过 在100%缩放下制作的用户界面在其他缩放百分比下会出现字体超出边框的情况,导致用户体验大打折扣。用户程序DPI感知是默认打开的,此时可以通过关闭这种感知来禁用字体的缩放,在这种情况下,用…

C语言指针详解

目录 指针是什么? 指针和指针类型 指针-整数 指针的解引用 野指针 野指针成因 如何规避野指针 指针运算 指针- 整数 指针-指针 指针的关系运算 指针和数组 二级指针 指针数组 指针数组 模拟二维数组 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个…

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON:串行控制寄存器 (可位寻址) 2.1.2 PCON:电源控制寄存器(不可位寻址) 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后,生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip ,然后再双击解压,会生成一个 Payload 文件夹,里面一个文件 如下图: 然后显示改文件的包内容: 解压 Assets.car 文件的方式&…

基于x-scan的渲染算法

基于x-scan算法实现的z-buffer染色&#xff0c;.net core framework 3.1运行。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula getFormula();Box rect getBound();for …

力扣 968. 监控二叉树

题目来源&#xff1a;https://leetcode.cn/problems/binary-tree-cameras/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;节点可以分为3个状态&#xff1a;0无覆盖&#xff1b;1有摄像头&#xff1b;2有覆盖。 要想放的摄像头最少&#xff0c;应当叶子…

无涯教程-jQuery - stop( clearQueue, gotoEnd)方法函数

stop([clearQueue&#xff0c;gotoEnd])方法停止所有指定元素上的所有当前正在运行的动画。 stop( [clearQueue, gotoEnd ]) - 语法 selector.stop( [clearQueue], [gotoEnd] ) ; 这是此方法使用的所有参数的描述- clearQueue - 这是可选的布尔参数。设置为true会清除动画…

绕过TLS/akamai指纹护盾

文章目录 前言TLS指纹什么是TLS指纹测试TLS指纹绕过TLS指纹使用原生urllib使用其他成熟库&#xff01;&#xff01;修改requests底层代码 Akamai指纹相关&#xff08;HTTP/2指纹&#xff09;什么是Akamai指纹测试Akamai指纹绕过Akamai指纹使用其他成熟库 实操参考 前言 有道是…

Eureka 学习笔记3:EurekaHttpClient

版本 awsVersion ‘1.11.277’ EurekaTransport 用于客户端和服务端之间进行通信&#xff0c;封装了以下接口的实现&#xff1a; ClosableResolver 接口实现TransportClientFactory 接口实现EurekaHttpClient 接口实现及其对应的 EurekaHttpClientFactory 接口实现 private …

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

第120天:免杀对抗-防朔源防流量防特征CDN节点SSL证书OSS存储上线

知识点 #知识点&#xff1a; 1、CS-CDN节点-防拉黑 2、CS-SSL证书-防特征 3、CS-OSS存储-防流量#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载面-D…

springCloud Eureka注册中心配置详解

1、创建一个springBoot项目 2、在springBoot项目中添加SpringCloud依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>…

IDEA 使用 maven 搭建 spring mvc

1. 创建项目 1.1 创建成功之后配置 Spring MVC 1.2 勾选 Spring MVC 2.更改配置文件 2.1 更改web.xml配置 更改为 <servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>2.2 dispat…

CF1833 A-E

A题 题目链接&#xff1a;https://codeforces.com/problemset/problem/1833/A 基本思路&#xff1a;for循环遍历字符串s&#xff0c;依次截取字符串s的子串str&#xff0c;并保存到集合中&#xff0c;最后输出集合内元素的数目即可 AC代码&#xff1a; #include <iostrea…

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol 0. 版本0.1 SignedMath.sol 1. 目标合约2. 代码精读2.1 max(int256 a, int256 b) && min(int256 a, int256 b)2.2 average(int256 a, int256 b)2.3 abs(int256 n) 0. 版本 [openzeppelin]&#xff1a;v…

final的使用以及权限修饰符

final表示最终的、不可改变的 final跟abstract不可以同时使用&#xff0c;因为二者是冲突的。final表示不可变&#xff0c;abstrac表示必须要重写、必须要变。 常见的四种用法 修饰一个类 格式&#xff1a; public final class 类名称{ }final修饰之后&#xff0c;这个类不能…

杂谈项——关于我在bw上的见闻,以及个人对二次元游戏行业方面的前瞻

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家带来一点不一样的&#xff0c;首先先光速叠一下甲&#xff1a; 在此说明博主并不是一个什么都知道的大佬&#xff0c;只是一个普通的老二次元以及期望以后能…

大数据-Spark批处理实用广播Broadcast构建一个全局缓存Cache

1、broadcast广播 在Spark中&#xff0c;broadcast是一种优化技术&#xff0c;它可以将一个只读变量缓存到每个节点上&#xff0c;以便在执行任务时使用。这样可以避免在每个任务中重复传输数据。 2、构建缓存 import org.apache.spark.sql.SparkSession import org.apache.s…

Xshell配置ssh免密码登录-公钥与私钥登录linux服务器

目录 简介 提示 方法步骤 步骤1&#xff1a;生成密钥公钥&#xff08;Public key&#xff09;与私钥(Private Key) 方法1&#xff1a;使用xshell工具 方法2&#xff1a;使用命令行 步骤2&#xff1a;放置公钥(Public Key)到服务器 方法1&#xff1a;&#xff08;我使用的是…