网络编程学习一

news2024/12/23 16:59:15

1、初识网络编程

2、网络编程三要素

3、三要素(IP)

4、IPV4的一些小细节

5、Inetaddress类的使用

package com.leitao.demo.network;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class IntAddress {
    public static void main(String[] args) throws UnknownHostException {
        //1.获取InetAddress的对象
        //IP的对象 一台电脑的对象
        InetAddress address = InetAddress.getByName("DESKTOP-C280N7F");
        System.out.println(address);

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

        String ip = address.getHostAddress();
        System.out.println(ip);
    }
}

6、端口号

7、协议

8、UDP协议(发送数据)

package com.leitao.demo.network;

import java.io.IOException;
import java.net.*;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class UDPDemo {
    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(快递公司)
        /**
         * 细节:
         *      绑定端口,以后我们就是通过这个端口往外发送
         * 空参:所有可用的端口中随机一个进行使用
         * 有参:指定端口号进行绑定
         */
        DatagramSocket socket = new DatagramSocket();

        //2.打包数据
        String str = "woshinidie!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10010;
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);

        //3.发送数据
        socket.send(packet);

        //4.释放数据
        socket.close();
    }
}

9、UDP协议(接收数据)

package com.leitao.demo.network;

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

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class UDPReceiveDemo {
    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(快递公司)
        /**
         * 细节:
         *      在接收的时候,一定要绑定端口
         *      而且绑定的端口,一定要跟发送的端口保持一致
         */
        DatagramSocket datagramSocket = new DatagramSocket(10010);

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

        /**
         * receive()该方法是阻塞的
         * 程序执行到这一步的时候,会在这里死等
         * 等发送端发送消息
         */
        System.out.println("1111111");
        datagramSocket.receive(datagramPacket);
        System.out.println("22222222");

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

        System.out.println("接受数据到" + new String(data,0,length));
        System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");

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

10、UDP练习(聊天室)

发送端

package com.leitao.demo.network;

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

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket();
        //2.打包数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入信息:");
            String str = sc.nextLine();
            if ("886".equals(str)){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10010;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            //3.发送数据
            ds.send(dp);
        }
        //4.释放资源
        ds.close();
    }
}

接收端

package com.leitao.demo.network;

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

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket(10010);
        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        while (true) {
            ds.receive(dp);
            //3.解析数据包
            byte[] data = dp.getData();
            int length = dp.getLength();
            String ip = dp.getAddress().getHostAddress();
            String name = dp.getAddress().getHostName();
            //4.打印数据
            System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,length));
        }

    }
}

11、单播、组播、广播

组播:创建MulticastSocket对象

12、TCP协议(发送和接收数据)

客户端

package com.leitao.demo.network;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class TCPSendMessageDemo {
    public static void main(String[] args) throws IOException {
        //TCP协议,发送数据

        //1.创建socket对象
        /**
         * 细节:在创建对象的同事会连接服务端
         *      如果连不上,代码会报错
         */
        Socket socket = new Socket("127.0.0.1", 10010);

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

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

服务端

package com.leitao.demo.network;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class TCPReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //TCP协议,接收数据

        //1.创建对象ServerSocket
        ServerSocket serverSocket = new ServerSocket(10010);

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

        //3.从连接通道中获取输入流读取数据
        InputStream inputStream = accept.getInputStream();
        int b;
        while ((b = inputStream.read()) != -1) {
            System.out.println((char) b);
        }

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

13、TCP协议(中文乱码问题)

将字节流转化为字符流即可

package com.leitao.demo.network;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/15
 * @Version V1.0
 **/
public class TCPReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //TCP协议,接收数据

        //1.创建对象ServerSocket
        ServerSocket serverSocket = new ServerSocket(10010);

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

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

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

14、TCP协议(代码细节)

15、三次握手和四次挥手

16、综合练习01(多发多送)

Client 客户端

package com.leitao.demo.network.test1;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/16
 * @Version V1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象并连接服务端
        Socket socket = new Socket("127.0.0.1", 10010);
        //2.写出数据
        Scanner sc = new Scanner(System.in);
        OutputStream os = socket.getOutputStream();
        while (true) {
            System.out.println("请输入您要发送的信息:");
            String str = sc.nextLine();
            if ("886".equals(str)) {
                break;
            }
            os.write(str.getBytes());
        }
        //3.释放资源
        socket.close();
    }
}

Server 服务器

package com.leitao.demo.network.test1;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/16
 * @Version V1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建对象绑定10010端口
        ServerSocket ss = new ServerSocket(10010);
        //2.等待客户端来连接
        Socket socket = ss.accept();
        //3.读取数据
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        int b;
        while ((b = isr.read()) != -1) {
            System.out.print((char) b);
        }
        //4.释放资源
        socket.close();
        ss.close();
    }
}

结果

17、综合练习02(接收并反馈)

代码分为两大部分,客服端往服务器发送数据吗,数据的流向要清楚;回写的数据流向也要明白

还需要客户端写一个结束标记,不然客户端read方法会一直等待接收数据

客户端

package com.leitao.demo.network.test2;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/20
 * @Version V1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象并连接服务器
        Socket socket = new Socket("127.0.0.1",10010);
        //2.写出数据
        String str = "你好,我是帅哥";
        OutputStream os = socket.getOutputStream();
        os.write(str.getBytes());

        //写出一个结束标记
        socket.shutdownOutput();

        //3.接收服务端回写的数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        int b;
        while ((b = isr.read()) != -1) {
            System.out.print((char)b);
        }
        //释放资源
        socket.close();
    }
}

服务器

package com.leitao.demo.network.test2;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Description: TODO
 * @Author LeiTao
 * @Date 2023/2/20
 * @Version V1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建对象并绑定端口
        ServerSocket ss = new ServerSocket(10010);
        //2.等待客户端连接
        Socket socket = ss.accept();
        //3.socket 中获取输入流读取数据
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        int b;
        /**
         * 细节:
         * read方法会从连接通道中读取数据
         * 但是,需要有一个结束标记,此处的循环才会停止
         * 否则,程序就会一直停在read方法这里,等待读取接下来的数据
         */
        while ((b = isr.read()) != -1) {
            System.out.print((char)b);
        }

        //4.回写数据
        String str = "很帅吗";
        OutputStream os = socket.getOutputStream();
        os.write(str.getBytes());
        //释放资源
        socket.close();
        ss.close();
    }
}

18、综合练习03(上传文件)

。。。。。。

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

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

相关文章

移动WEB开发三、flex布局

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

企业数字化管理是什么?如何建立企业数字化管理?

企业数字化管理是什么,如何建立企业数字化管理? 01 什么是企业数字化管理? 提到企业数字化管理,就不得不联想到机器自动化、业务流程自动化以及数字处理自动化这三个概念的区别: ​而抛开那些又臭又长的概念解读&…

支持域自适应的可解释网络改进药物-靶标预测

预测药物-靶点相互作用是药物发现的关键。最近基于深度学习的方法表现出良好的性能,但仍然存在两个挑战: 如何明确地建模和学习药物和靶标之间的局部相互作用,以更好地预测和解释;如何优化新型药物-靶标对预测的泛化性能。 在这…

高斯课堂 计算机网络(下)

第四章、网络层 0、第四章导图 1、网络层概述及IP地址(上) (1)网络层概述 无连接指的是在网络层这一层次,我们在发送数据的时候,不需要实现建立连接,这种建立连接的可靠性由谁来保证呢&#x…

【Python入门第十三天】Python 元组

元组(Tuple) 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 实例 创建元组: thistuple ("apple", "banana", "cherry") print(thistuple)运行实例 访问元组项目 您可以通…

【Mysql】存储过程

【Mysql】存储过程 文章目录【Mysql】存储过程1.存储过程1.1 存储过程概述1.2 特点1.3 基本语法1.3.1 创建1.3.2 调用1.3.3 查看1.3.4 删除1.4 变量1.4.1 系统变量1.4.2 用户定义变量1.4.3 局部变量1.5 if1.6 参数1.7 case1.8 循环1.8.1 while1.8.2 repeat1.8.3 loop1.9 游标1.…

keepalived高可用

文章目录前言一、Keepalived简介二、keepalived工作原理三、配置文件四、实验过程1.某台Real Server down2.LVS本身down方法:五、代码详细演示整体过程调度器安装软件、设置测试keepalived对后端RS的健康检测backup服务主机设置总结前言 一、Keepalived简介 Keepali…

【深度学习】训练模型结果同时显示,模型结果对比

码字不易,如果各位看官感觉该文章对你有所帮助,麻烦点个关注,如果有任何问题,请留言交流。如需转载,请注明出处,谢谢。 文章链接:【深度学习】训练模型结果同时显示,模型结果对比_莫…

Python - 绘制人体生物节律

文章目录项目说明关于人体生物节律用到的技术代码实现获取每月有多少天计算每天到生日过了多少天计算节律绘图结果项目说明 这里仿照 http://www.4qx.net/The_Human_Body_Clock.php 做一个人体生物节律的计算和展示 关于人体生物节律 百度/维基百科 解释 https://zh.wikiped…

DaVinci 偏好设置:系统 - 内存和 GPU

偏好设置 - 系统/内存和 GPUPreferences - System/Memory and GPU内存和 GPU Memory and GPU 选项卡提供了内存配置以及 GPU 配置的相关设置。内存配置Memory Configuration系统内存System Memory列出了所用电脑的总的可用内存。限制 Resolve 内存使用到Limit Resolve memory u…

Java中如何创建和使用对象?

要想使用一个类则必须要有对象。在Java程序中可以使用new关键字创建对象,具体格式如下:类名对象名称null; 对象名称new 类名();上述格式中,创建对象分为声明对象和实例化对象两步,也可以直接通过下面的方式创建对象,具…

从 ClickHouse 到 Apache Doris,腾讯音乐内容库数据平台架构演进实践

导读:腾讯音乐内容库数据平台旨在为应用层提供库存盘点、分群画像、指标分析、标签圈选等内容分析服务,高效为业务赋能。目前,内容库数据平台的数据架构已经从 1.0 演进到了 4.0 ,经历了分析引擎从 ClickHouse 到 Apache Doris 的…

H5使用微信JSSDK的wx.chooseImage进行多文件上传

背景:项目需要用H5做一个上传多图片合成的功能页面,这里我先做了调查,调查结果是安卓在微信内核不能使用传统的input file进行多文件上传,只能限制每次上传一张,ios则不限制,所以H5想在微信内核进行多图片上…

实验室三维磁场电磁铁的主要用途及技术指标

产品用途: 北京锦正茂科技有限公司自主研发的多极电磁铁以四极电磁铁居多,也有五极、六极、八极等多极的应用,主要应用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量、磁性…

实力见“证”:Tapdata 技术创新与发展潜力广受认可

Tapdata 积极拥抱各种“不确定”,变中求新,只为呈现出更加好用的产品。 而 Tapdata 在专业领域不断深耕,持续打磨产品能力的同时,也收获了诸多来自外界的肯定,从用户到投资人,从生态伙伴到技术媒体以及官方…

【Mysql系列】Mysql之窗口函数

适用场景 窗口函数适用场景: 对分组统计结果中的每一条记录进行计算的场景下, 使用窗口函数更好, 注意, 是每一条;因为MySQL的普通聚合函数的结果(如 group by)是每一组只有一条记录。 准备数据 创建表 create table app_product (id bigint auto_in…

4次迭代,让我的 Client 优化 100倍!泄漏一个 人人可用的极品方案!

4次迭代,让我的HttpClient提速100倍 在大家的生产项目中,经常需要通过Client组件(HttpClient/OkHttp/JDK Connection)调用第三方接口。 尼恩的一个生产项目也不例外。 在一个高并发的中台生产项目中。有一个比较特殊的请求,一次…

「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。Mong…

积分球原理及积分球类型介绍

标题积分球标准型积分球LED积分球均匀光源便携式高亮度积分球均匀光源微光积分球均匀光源积分球均匀光源iSphere高光谱响应光学积分球其他分类积分球 积分球原理:由于球体内整涂有白色漫反射材料的空腔球体,球壁上开有采样口,当待测样品光源进入积分球的…

Java之关于String字符串笔试面试重点

目录 一.关于字符串的常量池 1.关于字符串产生的三种方式 2.关于字符串的常量池 3.直接赋值法和new的方式产生对象的区别 二.关于intern方法 1.情况一(已经包含) 2.情况二(已经包含) 3.情况三(未包含) 4.情况四 三.关于字符串的不可变性 1.了解字符串的不可变性 2.Str…