Java基础(五)

news2024/11/23 7:00:15

前言:本博客主要记录学习网络通信的基本知识以及网络编程的应用。

网络编程

基本的通信架构

CS架构(Cilent客户端/Server服务端)

BS架构(Browser浏览器/Server服务端)

网络通信三要素

网络通信三要素:IP地址、端口、协议

IP地址

作用:找到网络上的通信设备

  • IPv4
  • IPv6

公网IP

内网IP 192.168.0.0

特殊的IP:127.0.0.1、localhost 代表本机

Ping IP地址,查看网络是否连通

InetAddress

package learn14;

import java.net.InetAddress;

public class InetAddressTest {
    public static void main(String[] args) throws Exception {
        //获取本机IP地址对象
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());
        //获取指定IP或域名的IP地址对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        System.out.println(ip2.isReachable(10000));
    }
}

端口

作用:找到设备中的应用程序

范围是0~65535

分类:

周知端口:0~1023,预先定义的知名应用占用(HTTP 80 FTP 81)

注册端口:1024~49151,分配给进程或某些应用程序

动态端口:49152~65535,不固定分配给某种进程

自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错

协议

网络上通信的设备,事先规定的连接规则,以及传输数据的规则,被称为网络通信协议

OSI网络参考模型

TCP/IP网络模型

传输层的2个通信协议

UDP 用户数据报协议

特点:无连接、不可靠协议

应用:通信效率高,适合语音通话、视频直播

TCP 通信协议

特点:面向连接、可靠协议

TCP主要有三个步骤实现可靠连接:三次握手建立连接,传输数据进行确认,四次握手断开连接。

应用:通信效率相对不高,适合网页、文件下载、支付

TCP 传输控制协议

网络编程

UDP通信

客户端发送数据,服务端接受数据

一次发送,一次接收

package learn14;

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

public class Client {
    public static void main(String[] args) throws Exception {
        //创建客户端对象 (发数据)
        DatagramSocket socket = new DatagramSocket(8888);
        //创建数据包对象封装要发出去的数据
        byte[] bytes = "hello,world".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 6666);
        socket.send(packet);
        System.out.println("客户端数据发送完毕!");

        socket.close();

    }
}
package learn14;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动!");
        //创建一个服务端对象
        DatagramSocket socket = new DatagramSocket(6666);
        //创建一个数据包对象
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        //使用数据包来接受客户端发来的数据
        socket.receive(packet);
        //获取本次数据包接收的数据 接受多少打印出来
        int len = packet.getLength();
        String rs = new String(buffer, 0, len);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(packet.getPort());
        System.out.println(rs);
    }
}

多次发送,多次接收

package learn14;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动!");
        //创建一个服务端对象
        DatagramSocket socket = new DatagramSocket(6666);
        //创建一个数据包对象
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        //使用数据包来接受客户端发来的数据
        while (true) {
            socket.receive(packet);
            //获取本次数据包接收的数据 接受多少打印出来
            int len = packet.getLength();
            String rs = new String(buffer, 0, len);
            System.out.println(rs);
            System.out.println(packet.getAddress().getHostAddress());
            System.out.println(packet.getPort());
        }
    }
}
package learn14;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //创建客户端对象 (发数据)
        DatagramSocket socket = new DatagramSocket();
        //创建数据包对象封装要发出去的数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
            if ("exit".equals(msg)) {
                System.out.println("欢迎下次光临");
                socket.close();
                break;
            }
            byte[] bytes = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 6666);
            socket.send(packet);
        }

    }
}

需要配置下,多开几个客户端

需要注意,端口号需要随机分配,否则会有以下报错

TCP通信

一次发送,一次接收

package learn14;

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

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);
        //从socket通信管道中得到一个字节输出流,用来发送数据给服务程序
        OutputStream os = socket.getOutputStream();
        //把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        //写入数据
        dos.writeUTF("hello!!!");
        //释放连接资源
        dos.close();
        socket.close();
    }
}
package learn14;

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

public class ServerTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动成功");
        //创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(8888);
        //使用ServerSocket对象
        Socket socket = serverSocket.accept();
        //从socket通信管道得到一个字节输入流
        InputStream is = socket.getInputStream();
        //把原始的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);
        //使用数据输入流读取客户端发送的消息
        String rs = dis.readUTF();
        System.out.println(rs);

        System.out.println(socket.getRemoteSocketAddress());
        dis.close();
        socket.close();
    }
}

多次发送,多次接收

package learn14;

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

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);
        //从socket通信管道中得到一个字节输出流,用来发送数据给服务程序
        OutputStream os = socket.getOutputStream();
        //把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);
        //写入数据
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
            if ("exit".equals(msg)) {
                System.out.println("退出成功,欢迎下次光临!");
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}
package learn14;

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

public class ServerTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动成功");
        //创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(8888);
        //使用ServerSocket对象
        Socket socket = serverSocket.accept();
        //从socket通信管道得到一个字节输入流
        InputStream is = socket.getInputStream();
        //把原始的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);
        //使用数据输入流读取客户端发送的消息
        while (true) {
            try {
                String rs = dis.readUTF();
                System.out.println(rs);
                System.out.println(socket.getRemoteSocketAddress());
            } catch (IOException e) {
                System.out.println(socket.getRemoteSocketAddress() + "离线了");
                dis.close();
                socket.close();
                break;
            }
        }
    }
}

多个客户端同时通信

package learn14;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;

public class ServerReaderThead extends Thread {
    private Socket socket;

    public ServerReaderThead(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                } catch (Exception e) {
                    System.out.println("有客户端下线了:" + socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package learn14;

import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动成功");
        //创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(8888);
        //使用ServerSocket对象
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("客户端上线了:"+socket.getRemoteSocketAddress());
            //将通信管道交给独立的线程处理
            new ServerReaderThead(socket).start();
        }
    }
}
package learn14;

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

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);
        //从socket通信管道中得到一个字节输出流,用来发送数据给服务程序
        OutputStream os = socket.getOutputStream();
        //把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);
        //写入数据
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
            if ("exit".equals(msg)) {
                System.out.println("退出成功,欢迎下次光临!");
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

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

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

相关文章

【02】FISCOBCOS搭建区块链网络

官方文档https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html 第一步. 安装依赖 开发部署工具 build_chain.sh脚本依赖于openssl, curl,根据您使用的操作系统,使用以下命令安装依赖。 sudo apt install -y openssl …

【深度学习实验】前馈神经网络(九):整合训练、评估、预测过程(Runner)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. __init__(初始化) 2. train(训练) 3. evaluate(评估) 4. predict(预测) 5. save_model 6. load_model 7. 代码整合 一、实验介绍 二、实验环境 本系列实验使用…

latexocr安装过程中遇到的问题解决办法

环境要求:需要Python版本3.7,并安装相应依赖文件 具体的详细安装步骤可见我上次写的博文:Mathpix替代者|科研人必备公式识别插件|latexocr安装教程 ‘latexocr‘ 不是内部或外部命令,也不是可运行的程序或批处理文件的相关解决办…

获取文件创建时间

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Java源码 public void testGetFileTime() {try {String string "E://test.txt";File file new File(string);Path path file.toPath();BasicFileAttributes ba…

Python 运行代码

一、Python运行代码 可以使用三种方式运行Python,如下: 1、交互式 通过命令行窗口进入 Python 并开始在交互式解释器中开始编写 Python 代码 2、命令行脚本 可以把代码放到文件中,通过python 文件名.py命令执行代码,如下&#xff…

Grafana离线安装部署以及插件安装

Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。Grafana主要特性:灵活丰富的图形…

Idea远程调试Linux服务器(和docker容器)中的Java服务,实测可用

目录 idea远程调试linux上的java服务 idea远程调试linux上docker中的java服务 本地配置 打开设置 添加Remote 环境:java1.8 idea远程调试linux上的java服务 在远程Linux服务器上启动Java应用程序时,请使用以下命令行选项启用调试: java -agentlib:…

R3300L, Q7 ATV Android9固件

R3300L, Q7 ATV Android9固件 固件来源 https://www.znds.com/tv-1239603-1-1.html 之前在恩山上发布过1080p安卓6固件 https://www.right.com.cn/forum/thread-1761250-1-1.html, 这个固件的不足之处就是没有 Google Service Framework, 只能通过 Smart Youtube 之类的第三方…

Mac台式电脑内存清理方法教程

对于一些小白用户,如果觉得以上的清理方法比较复杂却又想要更好的优化Mac电脑内存,专业的系统清理软件是一个不错的选择。比起花几个小时时间浏览文件夹、删除临时文件、缓存和卸载残留。Cleanmymac X,只需单击几下即可完成所有内存清理工作&…

华为云:成就卓越企业,引领智能未来

编辑:阿冒 设计:沐由 “预感总是倏然来临,灵光一现,好像一种确凿无疑的信念在瞬间萌生却无从捕捉。”在其传世的《百年孤独》一书中,加西亚马尔克斯曾经这样写道。 如此笃信却无力的感觉,也让很多急于以数字…

Python_it_heima

P63 list P68 元组 注意:元组内部嵌套的list包含的内容可以修改,但list本身不能修改。 P69 字符串 P71 数据容器(序列)的切片 P73 集合 P75 字典 字典的常用操作 字典课后练习 P78 类数据容器的总结对比 P79 数据容器的通用操作 不…

ros2发布者节点

没有书看啊,就来看看这个代码吧: 首先:第一个函数:init,通过f12可以知道这个函数共有4个变量,前面2个就这么填,后面2个有默认值,不用管,所以一般这么写就好了。 spin函…

IDEA2023新UI回退老UI

idea2023年发布了新UI,如下所示 但是用起来真心不好用,各种位置也是错乱,用下面方法可以回退老UI

聊聊Spring的Aware接口

文章目录 0.前言1.什么是Aware接口2.Aware接口的设计目的3.详解3.1. ApplicationContextAware我们举个例子来说明 3.2. BeanFactoryAware3.3. BeanNameAware3.4. ServletContextAware3.5. MessageSourceAware3.6. ResourceLoaderAware 4.参考文档 0.前言 背景: 最近…

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个…

建构居住安全生态,鹿客科技2023秋季发布会圆满举办

9月20日,以「Lockin Opening」为主题的2023鹿客秋季发布会在上海隆重举办,面向居住安全领域鹿客带来了最新的高端旗舰智能锁新品、多眸OS1.0、Lockin Care服务以及全联接OPENING计划。此外,现场还邀请了国家机构、合作伙伴、技术专家等业界同…

ai智能生成文章-智能生成文章软件

您是否曾为创作内容而感到头疼不已?是否一直在寻找一种能够帮助您轻松生成高质量文章的解决方案?什么是AI智能生成文章,特别是147SEO智能原创文章生成。这是一种先进的技术,利用人工智能和自然语言处理,能够自动生成各…

Ant Design分页组件中实现禁止点击当前页按钮的方法

这里需要使用到Ant Design分页组件pagination的一个回调函数onChange onChange函数用来监听鼠标点击事件, 它有两个入参》1. 点击分页按钮时获取到的页码 2. 每页最大显示条数 所以,禁止点击当前分页按钮的核心逻辑是: if {当前页的页…

mybatis-plus异常:dynamic-datasource can not find primary datasource

现象 使用mybatis-plus多数据源配置时出现异常 com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasource分析 异常原因是没有设置默认数据源,在类上没有使用DS指定数据源时,默…

批量、在线学习, 参数、非参数学习

批量学习(Batch Learning)和在线学习(Online Learning) 批量学习 批量学习的概念非常容易理解,我们之前介绍的许多机器学习算法,如果没有特殊说明,都可以采用批量学习的方式。批量学习的过程通…