Java中的网络编程

news2024/11/16 4:35:03

文章目录

    • 网络基础知识
      • 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();
        }
    }
    
    • 运行结果


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

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

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

相关文章

计算机组成原理19——控制单元的功能和实现1

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。 目录 四种周期下的微操作命令取指周期间址周期执行周期非访存…

antv/x6_2.0学习使用(四、边)

一、添加边 节点和边都有共同的基类 Cell,除了从 Cell 继承属性外,还支持以下选项。 属性名类型默认值描述sourceTerminalData-源节点或起始点targetTerminalData-目标节点或目标点verticesPoint.PointLike[]-路径点routerRouterData-路由connectorCon…

智慧旅游景区解决方案:PPT全文49页,附下载

关键词:智慧景区建设,智慧旅游平台,智慧旅游运营检测系统项目,智慧文旅,智慧景区开发与管理,智慧景区建设核心,智慧景区开发与管理 一、智慧景区建设现状 1、基础设施建设:智慧景区…

离散数学2

复习一下,P->Q,只有真的原因推假的结果,才是错的(正常逻辑),其余情况都是对的(善意规定以及正常逻辑) 反P析取Q,可以这样理解,因为是析取,结果为T的可能性…

强化学习求解TSP:Qlearning求解旅行商问题(Traveling salesman problem, TSP)提供Python代码

一、Qlearning简介 Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获…

Spark Core--加强

RDD的持久化 RDD缓存 当RDD被重复使用,或者计算该RDD比较容易出错,而且需要消耗比较多的资源和时间的时候,我们就可以将该RDD缓存起来。 主要作用: 提升Spark程序的计算效率 注意事项: RDD的缓存可以存储在内存或者是磁盘上,甚至…

为布偶猫精心挑选的三款主食冻干,K9、sc、希喂深度解析对比

喂养布偶猫的小技巧:如何满足其食肉天性同时呵护其肠胃?主食冻干是答案!它不仅符合猫咪天然的饮食结构,还采用新鲜生肉为原料。搭配其他营养元素,既美味又营养,还能增强抵抗力。我们将为您测评市场上热门的…

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境:系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下: Build from source | TensorFlow 从上图可以看出,python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

C++其他语法总结

目录 《C基础语法总结》《C面向对象语法总结(一)》《C面向对象语法总结(二)》《C面向对象语法总结(三)》 一、运算符重载 运算符重载可以为运算符增加一些新的功能全局函数、成员函数都支持运算符重载常用的运算符重载示例 class Point {…

Python私有变量的定义与访问

class Student():def __init__(self, name, age):self.name nameself.age ageself.__score 0def marking(self, score):if score < 0:return 分数不能为0self.__score scoreprint(self.name 同学本次得分是: str(self.__score)) def __talk(self): # 私有的类可通过在…

qss设置某一个widget下的Checkbox的样式

#ObjectName 控件名称{属性&#xff1a;值&#xff1b;属性1&#xff1a;值1} 如下&#xff1a; 效果&#xff1a;

【大数据】分布式协调系统 Zookeeper

分布式协调系统 Zookeeper 1.Zookeeper 的特点2.Zookeeper 的数据结构3.Zookeeper 的应用场景3.1 统一命名服务3.2 统一配置管理3.3 统一集群管理3.4 服务器动态上下线3.5 软负载均衡 Zookeeper 是 Apache 开源的一个顶级项目&#xff0c;目的是为分布式应用提供协调服务&#…

910b上跑Chatglm3-6b进行流式输出【pytorch框架】

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…

01-连接池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

分析一个项目(微信小程序篇)一

分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 本次所介绍的是微信小程序项目&#xff08;甑选商场&#xff09;&#xff1a; 其首页…

深度解析HubSpot数据分析:洞察未来商业趋势

在当今数字化的商业环境中&#xff0c;数据是推动决策和业务增长的关键。作为业内领先的CRM平台&#xff0c;HubSpot不仅为企业提供了高效的客户关系管理工具&#xff0c;同时也成为了数据分析的利器。 1. HubSpot数据分析的核心价值 1.1 洞察客户行为和趋势 HubSpot数据分析…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

domain adapation

假设测试资料和训练资料分布不一样&#xff0c; 训练为黑白数字&#xff0c;测试为彩色数字时&#xff0c;识别率很低 称之为 Domain shift Domain adaptation : 可以看做 transfer 的一种 输出分布也有可能不一样 target domain 有部分数据&#xff0c;但是无标签 分布也不…

css中的变量和辅助函数

变量 --name 两个破折号加变量名称&#xff08;可以在当前的选择器内定义&#xff09;var(--*) 命名规则 body {--深蓝: #369;background-color: var(--深蓝); } 变量值只能做用属性值&#xff0c;不能用做属性名。变量命名不能包含 $,[,^,(,% 等字符 普通字符局限在只要是数…

如何快速编写高效的测试用例? -5个建议让你的测试更准确、更全面

逛知乎的时候&#xff0c;经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力理论及经验加持。 但这并不意味着…