Java中的网络编程

文章目录

    • 网络基础知识
      • IP 地址
      • 端口
      • 协议
    • Java 中网络编程
      • InetAddress(静态类)
      • UDP 通信原理
        • UDP 发送数据步骤
        • UDP 接收数据步骤
        • UDP 发送接收案例
      • TCP 通信原理
        • TCP 发送数据步骤
        • TCP 接收数据步骤
        • TCP 发送接收案例

网络基础知识

  • 概述:在网络通信协议下(http/tcp/udp)实现网络互连的不同计算机上运行的程序间可以进行数据交换。

  • 网络编程中的三要素:

    名字作用
    IP 地址网络中设备的唯一标识
    端口应用程序的标识
    协议对数据的传输格式、传输速率、传输步骤做了统一的规定,通信双方必须同时遵守才能完成数据交换,常见协议有(TCP UDP)

IP 地址

  • 常见的 IP 地址

    • IPV4

      • 给每个连接在网络上的主机分配一个 32 bit (位)的地址,按照 TCP/IP 规定,IP 地址使用二进制表示,每个 IP 地址 32bit ,也就是 4 个字节(1字节=8位)

      • 十进制形式(点分十进制表示法):192.168.1.66

      • 二进制表示形式: 11000000.10101000.00000001.01000010

    • IPV6

      • 采用 128 bit , 16个字节一组,分成 8 组十六进制数据,解决了网络地址资源数量不够的问题。
  • 关于IP的一些命令(命令运行框使用)

    命令作用
    ipconfig查看本机IP地址
    ping IP 地址检查网络是否连通
  • 特殊的 IP 地址

    • 127.0.0.1 回送地址,可以代表本机地址,常用来测试
    • 例如(本地地址):
      • 127.0.0.1/demo/login.html
      • localhost/demo/login.html

端口

  • 端口号
    • 用两个字节表示的整数,它的取值范围是0~65535
    • 其中0~1023之间的端口号用于一些知名的网络服务和应用
    • 普通应用程序需使用1024以上的端口号,如果端口号被占用,会导致当前程序启动失败

协议

  • UDP协议

    1、用户数据报协议(User Datagram Protocol)
    2、UDP是无连接通信协议,发送端和接收端不会建立逻辑连接
    3、由于UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频、普通数据的传输
    4、由于UDP的面向无连接性,不能保证数据的完整性,因此传输重要数据不建议使用
  • TCP协议

    1、传输控制协议(Transmission Control Protocol)
    2、TCP协议是面向连接的通信协议,传输数据前,发送端和接收端建立逻辑连接,然后再传输数据
    3、提供两台计算机之间可靠无差错的数据传输,TCP中必须明确客户端与服务器端,三次握手
    4、保证数据传输的安全,上传文件,下载文件,浏览网页等
    5、三次握手:TCP协议中,在发送数据的准备阶段,客户端和服务器之间的三次交互,以保证可靠连接


Java 中网络编程

InetAddress(静态类)

  • 概述:为了方便我们对IP地址的获取和操作,Java提供了一个类 InetAddress 供我们使用。InetAddress : 表示Internet协议(IP)地址

  • 常用方法

    方法作用
    static InetAddress getByName(String host)确定主机名称的IP地址。
    主机名称可以是机器名称,也可以是IP地址
    String getHostName()获取此IP地址的主机名
    String getHostAddress()返回文本显示中的IP地址字符串
  • 代码演示

    • 首先 win + r ,输入 cmd 打开命令运行框

    • 输入 ipconfig,找到 IPV4 地址(红框圈住的就是主机名称)

    public class Test {
        public static void main(String[] args) throws UnknownHostException {
            // 使用 InetAddress类,调用方法,获取本机对象
            InetAddress lh = InetAddress.getByName("xiaoHeng");
            // 调用方法,获取此IP地址的主机名
            String hostName = lh.getHostName();
            // 调用方法,返回文本显示中的IP地址字符串
            String hostAddress = lh.getHostAddress();
            System.out.println("本机名称是:" + hostName);
            System.out.println("本机地址是:" + hostAddress);
        }
    }
    

    注意:代码演示的,换成自己主机名后,输出的 本地地址,就和 命令运行框 查看的 IPV4 地址一致


UDP 通信原理

  • 概述:UDP是一种不可靠的网络协议,它在通信两端各建立一个 Socket 对象,但是这两个 Socket 只是发送,接收数据的对象
  • DatagramSocket 基于UDP协议的Socket
UDP 发送数据步骤
  1. 创建发送端的 Socket 对象(DatagramSocket)

    DatagramSocket ds = new DatagramSocket();
    
  2. 创建数据,并把数据打包

    byte[] bys = "你好".getBytes();				// 将字符串转换成 字节数组
    DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("ip"),int port);
    
  3. 调用 DatagramSocket 对象的方法发送数据

    void send(DatagramPacket p);
    
  4. 关闭发送端

    void close();
    
UDP 接收数据步骤
  1. 创建接收端的 Socket 对象(DatagramSocket)

    DatagramSocket(int port);						// 根据端口号
    
  2. 创建一个数据包,用于接收数据

    DatagramPacket(byte[] bys , int length);
    
  3. 调用 DatagramSocket 对象方法接收数据

    void receive(DatagramPacket dp);
    
  4. 解析数据包,并展示在控制台

    byte[] getData();											// 数据缓冲区
    int getLength();											// 实际数据长度
    String s = new String(dp.getData(),0,dp.getLength());		// 转换成字符串
    
  5. 关闭接收端

    void close();
    
UDP 发送接收案例
  • 使用 UDP 协议,发送 “你好,世界!你好,中国!”,用接收端接收,并展示在控制台上?

    • 发送端(再开启服务端)
    // 发送端
    public class Client {
        public static void main(String[] args) throws IOException {
            // 1、创建发送端的 Socket 对象
            DatagramSocket ds = new DatagramSocket();
            // 2、创建数据,并将数据打包
            byte[] bys = "你好,世界!你好,中国!".getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 8080);
            // 3、调用 DatagramSocket 对象发送数据
            ds.send(dp);
            // 4、关闭发送端
            ds.close();
        }
    }
    
    • 接收端(先开启接收端)
    // 接收端
    public class Server {
        public static void main(String[] args) throws IOException {
            // 1、创建接收端的 Socket 对象
            DatagramSocket ds = new DatagramSocket(8080);
            // 2、创建一个数据包,用于接收数据
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys , bys.length);
            // 3、调用 DatagramSocket 对象方法接收数据
            ds.receive(dp);
            // 4、解析数据包,并展示在控制台
            byte[] data = dp.getData();
            int length = dp.getLength();
            String s = new String(data ,0,length);
            System.out.println(s);
            // 5、关闭接收端
            ds.close();
        }
    }
    

TCP 通信原理

  • 概述:TCP可靠的网络协议,在通信两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信

  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

  • Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信

TCP 发送数据步骤
  1. 创建客户端 Socket 对象(Socket)

    Socket(String host , int port);				// host:主机号 port:端口号
    
  2. 获取输出流,写数据

    OutputStream getOutputStream();
    
  3. 释放资源

    void close();
    
TCP 接收数据步骤
  1. 创建服务器端的Socket对象(ServerSocket)

    ServerSocket(int port);
    
  2. 监听客户端连接,返回一个 Socket 对象

    Socket accept();
    
  3. 获取输入流,读数据,并把数据显示在控制台上

    InputStream getInputStream();
    
  4. 释放资源

    void close();
    
TCP 发送接收案例
  • 使用 TCP 协议,建立客户端和服务端连接,在客户端使用键盘输入随机文字,显示在服务端控台上?IO 流可参考这篇文章

    • 服务端(接收数据,先打开服务端)
    public class Server {
        public static void main(String[] args) throws IOException {
            // 1、创建服务器端对象(端口号,随意)
            ServerSocket ss = new ServerSocket(8080);
            // 2、监听客户端连接
            Socket a = ss.accept();
            // 3、获取输入流,读数据,将数据展示在控制台上
            InputStream is = a.getInputStream();
    
            byte[] bys = new byte[1024];
            int len;
            while((len = is.read(bys)) != -1){
                System.out.println(new String(bys,0,len));
            }
    
            // 4、释放资源
            ss.close();
        }
    }
    
    • 客户端(发送数据,再打开客户端)
    public class Client {
        public static void main(String[] args) throws IOException {
            // 1、创建客户端 对象
            Socket s = new Socket("127.0.0.1",8080);
            // 2、获取输出流,写数据
            OutputStream os = s.getOutputStream();
            // 3、创建键盘输入对象
            Scanner sc = new Scanner(System.in);
            System.out.print("请输入你想要发送的内容:");
            String data = sc.next();
            // 4、利用输出流写数据
            os.write(data.getBytes());
            // 5、释放资源
            s.close();
        }
    }
    
    • 运行结果


欢迎大家留言,一起进入编程世界!

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

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

相关文章

vscode设置python脚本运行参数

1 添加配置文件 点击到你要配置的python文件,然后右上角点击 运行 ,再点击 添加配置 再点击 “Pyhton文件” 选项(其实就是在选择 当前的python文件 进行配置) 接着就生成了配置文件 lanunch.json 2 参数配置 再上面代码的基础上…

206. 反转链表(Java)

题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入: head [1,2,3,4,5] 输出: [5,4,3,2,1] 代码实现: 1.根据题意创建一个结点类: public class ListNode {int val…

Flask 菜品管理

common/libs/Helper.py getDictFilterField() 方法 用于在web/templates/food/index.html中展示菜品分类 如何能够通过food里面的cat_id获取分类信息呢?只能通过for循环,这样会很麻烦,所以定义了这个方法。 这个方法可以的查询返回结果…

传统 VC 机构,是否还能在 Fair launch 的散户牛市中胜出?

LaunchPad 是代币面向市场的重要一环,将代币推向市场,加密项目将能够通过代币的销售从市场上募集资金,同时生态也开始进入全新的发展阶段。而对于投资者来说,早期打新市场同样充满着机会,参与 LaunchPad 对于每一个投资…

通过iFrame嵌入Grafana页面或pannel

前言 在当前数据驱动的时代,有效地可视化和监控关键性能指标变得至关重要。Grafana,作为一个开源的监控解决方案,提供了强大的功能来呈现和分析数据,从而帮助用户及时洞察和响应各种情况。随着技术的不断发展,将这些信…

地图移动逻辑

主要的一些问题 0. 可能会很久没收到,,或者一下子同时受到很多个同步的包 关于坐标滞后导致的一些游戏逻辑问题,比如攻击命中的判定问题等,一般是以服务器数据为判定依据,逻辑判定还是以服务器为主,客户端主要做表现。 1. 插值 关于坐标上报频率,我采取的是每100ms 或…

RT-Thread基于AT32单片机的485应用开发(二)

在上篇RT-Thread基于AT32单片机的485应用开发(一)中实现了RS485收发,但总觉得效率不高,函数封装也不完善。考虑到RS485总线应用都是主从式结构,比如工业领域常用的Modbus协议,都是以帧为单位进行收发&#…

【Java集合篇】 ConcurrentHashMap在哪些地方做了并发控制

ConcurrentHashMap在哪些地方做了并发控制 ✅典型解析✅初始化桶阶段🟢桶满了会自动扩容吗🟠自动扩容的时间频率是多少 ✅put元素阶段✅扩容阶段🟠 拓展知识仓🟢ConcurrentSkipListMap和ConcurrentHashMap有什么区别☑️简单介绍一…

Chrome禁用第三方Cookie,有什么影响?

2024年,Chrome将要正式禁用第三方Cookie了,这个变化对Web开发者来说是非常重要的,因为它将改变开发者如何设计网站以及如何搜集和使用用户数据。这是怎么一回事,到底有什么具体影响? 什么是Cookie? 随着互…

支持向量机(Support Vector Machines,SVM)

什么是机器学习 支持向量机(Support Vector Machines,SVM)是一种强大的机器学习算法,可用于解决分类和回归问题。SVM的目标是找到一个最优的超平面,以在特征空间中有效地划分不同类别的样本。 基本原理 超平面 在二…

【漏洞复现】锐捷EG易网关cli.php后台命令执行漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关,由锐捷网络完全自主研发。它集成了先进的软硬件体系架构,配备了DPI深入分析引擎、行为分析/管理引擎,可以在保证网络出口高效转发的条件下,提供专业的流控功能、出色的URL过滤以及本地化…

面试算法110:所有路径

题目 一个有向无环图由n个节点(标号从0到n-1,n≥2)组成,请找出从节点0到节点n-1的所有路径。图用一个数组graph表示,数组的graph[i]包含所有从节点i能直接到达的节点。例如,输入数组graph为[[1&#xff0c…

C#编程-描述异常

描述异常 异常是在程序执行期间出现的错误。异常情况发生在运算不能正常完成的时候。当程序中出现异常是,系统会抛出错误。错误通过异常处理过程被处理。 例如,System.IO.IOException异常在试图访问非法流对象时抛出。同样,如果分母是0,整数除法运算抛出System.DivideByZ…

移动通信原理与关键技术学习(4)

1.小尺度衰落 Small-Scale Fading 由于收到的信号是由通过不同的多径到达的信号的总和,接收信号的增强有一定的减小。 小尺度衰落的特点: 信号强度在很小的传播距离或时间间隔内的快速变化;不同多径信号多普勒频移引起的随机调频&#xff…

Sentinel限流熔断

官网:https://sentinelguard.io/zh-cn/docs/introduction.html github文档:https://github.com/alibaba/Sentinel/wiki Sentinel 是一款面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从流量控制、 熔断降级 、系…

javaweb基础----JDBC、servlet(二)

一、连接数据库 在昨天的基础上,现在我想来实现前后端以及数据库的连接。 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/135388510?spm1001.2101.3001.4503在cn2包下创建2个类,一个登录界面login,还有一个实现登录过程的loginServlet…

CST—EMC(电磁兼容)仿真及分析工具

背景概述 随着汽车电子的发展特别是新能源互联网汽车的兴起,整车的EMC环境越来越恶劣,传统的EMC设计面临着设计阶段盲目性强、调试测试阶段工作量大、整改阶段重复性高等诸多挑战,需要通过EMC仿真来解决上述问题。EMC仿真贯穿产品开发全周期&…

40-特殊运算符delete,new,.getDate,.setDate,运算符优先级

1.delete删除. 数组 // 可以删除数组元素,可以删除对象键值对// 删除数组的值,数组长度保持不变// 删掉的值变成emptyvar arr [1,2,3,4,5];delete arr[0];console.log(arr); 对象 var obj {"a":"aa","b":"bb&quo…

Xcalibur软件Qual Brower程序的使用

找到Qual Brower:在System>Program里 打开采集的数据文件*.RAW,软件界面主窗口能查看色谱图和质谱图: 1、图形的放大和拷贝、色谱中查看峰的质谱信息: 点亮如图图像右上角的按钮,可以激活该图形并进行操作&#x…

AI Agent落地先行者实在智能:2023人工智能领军者、百强、TOP30揭榜

实在智能连登三榜! 【2023年十佳人工智能行业领军人物】 【2023年度人工智能领域创新企业】 【2023年度最具投资价值企业】 喜大普奔!近期,国内科技行业颇具含金量的三张榜单接连发布,实在智能皆榜上有名,“2023「…