[Java学习日记]网络编程

目录

一.常见的软件架构、网络编程三要素、IP

二.利用UDP发送与接收数据

三.改聊天室

四.组播案例

五.TCP通信案例


一.常见的软件架构、网络编程三要素、IP

网络编程:在网络通信协议下,不同的计算机上运行的程序进行的数据传输
在Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序

常见的软件架构:BS/CS
1.CS是什么架构?
ClientAndServer(客户端与服务器)本地客户端需要下载安装客户端程序,远程还有一个服务端程序
2.BS是什么架构?
BrowserAndServer(浏览器与服务器)只需要一个浏览器,用户通过不同的网址访问不同的服务器 ,
3.BS架构的优点与缺点?
不需要开发客户端,只需要页面与服务端,但是如果需要传递的数据过多过大就不适合使用网页了
很多时候都需要保存在本地-这就是客户端的形成,画面更加精美,

4.网络编程三要素有哪些?
如果要对对方传输数据
(1).确定对方的网络地址:IP(设备在网络中的地址,是唯一标识)
(2).确定对方的接收数据的软件:端口号(应用程序在设备中的唯一标识)
(3).确定网络传输的规则:协议(数据在网络中的传输规则:如UDP,TCP,http,https,ftp)

5.IP的含义与常见的IP类型?
Internet Protocol,是互联网协议地址,也称IP地址:是分配给上网设备的数字标签
常见的IP分为IPv4与IPv6

6.什么是IPv4,地址长度为多少位?分为多少组?IP在转换的时候有没有负数?
Internet Protocol(协议) version4:互联网通信协议第四版(正式开始使用的就是第四版)
采用32位地址长度,分为4组,每一组1字节,每组最大就是255
用点分十进制表示就是:192.168.1.66,注意IP在转换的时候没有负数
所有IP加起来不到43亿个,在2019.11.26这些IP已经被全部分配完毕

7.什么是IPv6?地址长度为多少为?分为多少组?一般用什么表示?可以如何省略?
Internet Protocol version6:互联网通信协议第六版
采用128位地址长度,分为8组,每组两个字节(这数量有生之年不可能用的完了)
用冒分十六进制表示就是:2001:0DBB:0000:0023:0008:0800:200C:417A
一般省略每一组前面的0:2001:DBB:0:23:8:200C:417A
如果中间有很多0:就可以使用0位压缩表示法:FF01:0:0:0:0:0:0:1101->FF01::1101

8.IPv4的地址分类有哪两种?
一类是公网IP(万维网使用),一类是私有地址(局域网使用)
私有地址:
A类 10.0.0.0 --10.255.255.255
B类 172.16.0.0–172.31.255.255
C类 192.168.0.0–192.168.255.255
比如192.168开头的就是私有地址,范围就是192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节省IP

9.私有地址是公网地址吗?
比如在网吧中,不是每一台电脑都有一个公网的IP,一般是共享同一个公网IP,再由路由器给每台电脑分配局域网IP,由此节约IP

10.特殊IP:127.0.0.1:也可以是localhost是什么地址?
是送回地址,也是本地回环地址,成为本机IP,永远只会寻找当前所在的本机
如果电脑要发送消息:假如自己的Ip是192.168.1.100,如果发消息给自己这个IP,要先发送到路由器,再由路由器分配消息
不是每个路由器分配给你的IP是一样的,自己给自己发送数据就写127.0.0.1

11.常见的cmd命令有哪些?
ipConfig+ping(也能检查局域网是否畅通)

IP地址类:InetAddress
有两个子类:一个是IPv4,一个是IPv6,会自动判断是哪个版本的再去创建其子类对象
12.如何创建IP地址对象?
13.如何通过IP对象获取主机名与IP地址?
public class Demo331 {
    public static void main(String[] args) throws UnknownHostException {
        System.out.println("12.使用InetAddress的静态方法去创建对象,可以传入IP,也能传入主机名");
        InetAddress IP1 = InetAddress.getByName("127.0.0.1");
        System.out.println(IP1);
        InetAddress IP2 = InetAddress.getByName("SUNCOYA-COMPUTER");
        System.out.println(IP2);

        System.out.println("13.通过getHostName方法获取主机名(如果局域网中没有这一台主机,那下面的输出就是以ip形式表示的)");
        System.out.println(IP2.getHostName());
        System.out.println("通过getHostAddress方法获取IP地址");
        System.out.println(IP2.getHostAddress());
    }
}

 


 

二.利用UDP发送与接收数据

1.端口号是什么?由多少字节表示?端口号的范围为?什么范围的端口号被占用?
应用程序在设备中的唯一标识,由两个字节表示的整数,范围为0-65535
0-1023端口用于知名的网络服务或者是应用,一个端口号只能被一个应用使用。

协议:连接和通信的规则被称为网络通信协议
下面两个是传输层协议:
2.什么是UDP?有什么特点?
(User Datagram Protocol)
是面向无连接通信协议(数据直接发送,不检查两台电脑是否可以连通,爱要不要),
传输速度快,有大小限制,一次最多发送64K,数据不安全,容易丢失数据
用于丢一点数据不太影响功能的应用:语音通话网络会议可以使用
3.什么是TCP?有什么特点?
(Transmission Control Protocol(传输控制协议))
是面向连接的通信协议,速度慢,没有大小限制,数据安全
比如发送邮件

4.利用UDP发送数据的具体步骤?
以快递为例
1.找快递公司2.打包礼物3.快递公司发送包裹4.付钱走人
public class Demo332 {
    public static void main(String[] args) throws IOException {
        System.out.println("(1)使用DatagramSocket(数据包套接字)创建对象的时候可以指定端口:如果不指定,随机使用一个端口发");
        DatagramSocket ds = new DatagramSocket();

        System.out.println("(2)使用DatagramPacket包裹信息:数据,长度,IP,端口");
        byte[] bytes = "你好UDP协议!".getBytes();
        InetAddress IP = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,IP,port);

        System.out.println("(3)使用datagramSocket对象的send方法发送datagramPacket数据");
        ds.send(dp);
        System.out.println("(4)释放datagramSocket资源");
        ds.close();
    }
}
1.利用UDP接受数据数据:以快递为例
1.找快递公司2.接收打包3.在箱子里面找礼物(解析数据)4.签收走人(释放资源)

2.接收端与发送端的运行顺序有要求吗?
先运行接收端,再运行发送端,下面的控制台能够切换
public class Demo333 {
    public static void main(String[] args) throws IOException {
        System.out.println("(1)创建接收端的DatagramSocket对象,需要指定发送端的端口");
        DatagramSocket ds = new DatagramSocket(10086);

        System.out.println("(2)新建datagramPacket对象,接收对象需要的数组与长度也需要传递");
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        System.out.println("使用ds的receive方法接收对象,方法是阻塞的:程序执行到这里会死等数据的到来");
        ds.receive(dp);

        System.out.println("(3)使用dp的get数据方法解析数据包");
        byte[] data = dp.getData();
        int length = dp.getLength();
        InetAddress IP = dp.getAddress();
        int port = dp.getPort();
        //变成字符串注意一下长度
        System.out.println(new String(data,0,length)+"\n数据长度:"+length+"\n数据发送地址:"+IP+"\n端口:"+port);

        System.out.println("(4)关闭接收端");
        ds.close();
    }
}

 

 

 


 

三.改聊天室

1.如何使一个类的运行变成多个不同的线程?
在右上角的类名点击Edit Configurations,ModifyOptions选择第一个,使一个类能重复运行多次
2.datagramPacket类中传入的数据如果是字符串转换的byte数组,传入长度的时候应该注意什么?
传入的应该是byte数组的长度
public class Demo334 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String input = scanner.nextLine();
            byte[] bytes = input.getBytes();
            //这里的长度一开始传错了,注意不要传字符串的长度
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10086);
            ds.send(dp);
            //如果不关闭的话就变成了一个聊天室:多个人能够从这里面看到数据
            if ("886".equals(input)) break;
        }
        ds.close();
    }
}
public class Demo335 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10086);
        byte[] message = new byte[1024];
        DatagramPacket dp = new DatagramPacket(message,message.length);
        while (true){
            ds.receive(dp);
            String str = new String(dp.getData(),0,dp.getLength());
            InetAddress IP = dp.getAddress();
            int port = dp.getPort();
            System.out.println("IP为:"+IP+"端口为:"+port+"向10086端口发送了数据:");
            System.out.println(str);
            if ("886".equals(str))break;
        }
        ds.close();
    }
}

 

 


四.组播案例

单播:只给一台设备发送数据
组播:给一组设备发送数据(224.0.0.0—239.255.255.255)其中(224.0.0.0-224.0.0.255)256个为预留的组播地址)
广播:给局域网中所有的电脑发送数据255.255.255.255(四字节都是最大),广播就不试了,把单播的地址改为255.255.255.255即可
public class Demo336_MultyCast_Send {
    public static void main(String[] args) throws IOException {
        System.out.println("1.创建组播对象MulticastSocket(组播套接字)");
        MulticastSocket ms = new MulticastSocket();

        System.out.println("2.打包数据也是一样的流程");
        String s = "Hello, MulticastSocket";
        byte[] bytes = s.getBytes();
        System.out.println("IP指定为组播地址(不知道为什么224.0.0.1不行)");
        InetAddress IP = InetAddress.getByName("224.0.0.2");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,IP,port);

        System.out.println("3.使用组播套接字对象发送数据");
        ms.send(dp);
        ms.close();
    }
}
public class Demo337_MultiCast_Receive {
    public static void main(String[] args) throws IOException {
        System.out.println("1.创建组播套接字,并设置接收端口");
        MulticastSocket ms = new MulticastSocket(10000);

        System.out.println("2.将本机添加到224.0.0.2当中,往后就是接收,解析,关闭");
        ms.joinGroup(InetAddress.getByName("224.0.0.2"));

        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        ms.receive(dp);

        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();
        int port = dp.getPort();
        byte[] data = dp.getData();
        System.out.println("ip为"+ip+",主机名为"+name+"的及设备的端口号"+port+"发送了数据");
        System.out.println(new String(data,0,data.length));
        ms.close();
    }
}

 

 

 


 

五.TCP通信案例

TCP在通信的两端各建立一个Socket对象:通信之前要确保连接已经建立
通过IO流来进行网络通信

三次握手协议建立连接
1.客户端向服务器发送请求等待服务器确认
2.服务器向客户端返回请求,告诉客户端收到了请求
3.客户端向服务器再次发出确认消息,连接建立
TCP设计成三次握手的目的就是为了避免重复连接,因为会有多次请求的情况

四次挥手协议断开连接:需要确保连接通道里面的数据已经全部处理完(多的那一步)
1.客户端向服务器发送取消连接请求
2.服务端向客户端返回响应,表示已经收到了客户端的请求,需要等服务器处理完最后的数据
3.一旦处理完成,服务器向客户端再次发出确认需要取消连接的消息
4.客户端再次发送确认消息,取消连接

客户端
public class Demo338_TCP_Client {
    public static void main(String[] args) throws IOException {
        System.out.println("1.传入IP地址与端口号,建立Socket对象");
        System.out.println("在创建对象的时候会连接服务器,如果连接不上会报错");
        Socket socket = new Socket("127.0.0.1",10000);

        System.out.println("2.通过套接字对象获取字节输出流,向客户端输入数据");
        OutputStream os = socket.getOutputStream();
        os.write("Hello, TCP!".getBytes());

        System.out.println("3.关闭socket也可以关闭输出流");
        socket.close();
    }
}
服务器端
public class Demo339_TCP_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("1.创建服务端的ServerSocket对象,端口需要与客户端需要连接的端口保持一致");
        ServerSocket ss = new ServerSocket(10000);

        System.out.println("2.调用accept方法等待客户端连接,返回Socket对象");
        System.out.println("没有人连就会卡死在这一行代码,需要在这里获取Socket对象");
        Socket socket = ss.accept();

        System.out.println("3.获取输入流");
        InputStream is = socket.getInputStream();
        System.out.println("在这里一次性获得了所有的字节,因为此处比较简单,别的情况下中文可能会乱码,可以使用转换流");
        byte[] bytes  = is.readAllBytes();
        System.out.println(new String(bytes));

        System.out.println("4.关闭socket对象,相当于断开与客户端的连接");
        socket.close();
        System.out.println("5.关闭serverSocket对象,相当于终结服务器资源");
        ss.close();
    }
}

 

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

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

相关文章

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

springboot项目中注入bean后,调用时报n

需求: 在socket接收到上报数据后,在handler中调用工具类中ProtocolAnalyse的conAnalyse(byte[] data, int dataLen)解析数据。解析数据后,将解析后的结果保存至数据库。注入了三个bean: Autowiredprivate PersonTeService person…

基于融合正余弦和柯西变异的麻雀优化算法(SCSSA)-CNN-BiLSTM(双向长短期记忆网络)的时间序列预测模型

融合正余弦和柯西变异的麻雀优化算法(SCSSA)原理如下: ①采用折射反向学习策略初始化麻雀算法个体,基本思想是通过计算当前解的反向解来扩大搜索范围,借此找出给定问题更好的备选解;②采用正余弦策略替换原…

2023年建筑轮廓高度数据技术服务

在之前的文章【数据分享】全国62个城市建筑轮廓数据带层数(2018年)和【数据分享】全国77个城市建筑轮廓数据带高度(2019年)里我们分别分享了2018年和2019年2020年2021年2022年的建筑轮廓数据,数据年份也有些老了&#…

react实现加载动画

1.Spinning.tsx import "./Spinning.scss";interface Props {isLoading: boolean;children?: React.ReactNode; }const Spinning: React.FC<Props> ({isLoading true,children }) > {return <div className{spinning-wrapper${isLoading ? " l…

Hdoop学习笔记(HDP)-Part.2 核心组件原理

二、核心组件原理 1.分布式协调ZooKeeper (1)应用场景 使用分布式系统就无法避免对节点管理的问题&#xff08;需要实时感知节点的状态、对节点进行统一管理等&#xff09;&#xff0c;而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性&#xff0c;ZooKeeper作为一个…

5.C转python

新始: 13.列表可被改变(数据),元组不可被改变(数据),二者皆与C中的数组的大致相同 14.创建列表方法: 1.一个[ ]就是一个空的列表 2.使用list函数来创建列表 如: 15.可以在[ ]内部指定列表的初始值,打印方法: 如: 16.在python中,在同一个列表中,可以放不同类型的变量(也可…

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;Docker零基础入门专栏 目录 第 1 步&#xff1a;创建 Dockerfile 第 2 步&#xff1a;构建 Docker 镜像 第 3 步&#xff1a;运行 Docker 容器 第 4 步&#xff1a;验证输出 dockerfile命令详解 最佳实践 默认情况下…

oops-framework框架 之 初始了解(一)

引擎&#xff1a;CocosCreator 环境&#xff1a; Mac Gitee: oops-framework 简介 oops-framework是由作者dgflash编写&#xff0c;基于CocosCreator 3.x而实现的开源框架。 该框架以插件形式存在&#xff0c;主要目的是为了降低与项目的耦合&#xff0c;并且通过插件内部的…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

若依前后端分离版idea启动

1.项目地址 https://gitee.com/y_project/RuoYi-Vue2.修改配置 修改数据库配置 3.执行sql 4.启动项目 启动成功 5.启动前端 首先要安装nodejs,版本不能太高,本人用的nodejs11版本的 npm install --registry https://registry.npm.taobao.orgnpm run dev启动成功 访问 h…

态路小课堂丨InfiniBand与以太网:AI时代的网络差异

近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;以ChatGPT为代表的大型AI模型引起了广泛关注。然而&#xff0c;在这个AI时代&#xff0c;我们不得不重新审视传统的以太网和基于InfiniBand构建的网络之间的区别。尤其是今年以来&#xff0c;InfiniBand因其在AI领域中…

CRM:如何通过客户数据分析获得业务洞察?

客户数据分析&#xff0c;也称客户分析&#xff0c;是收集、组织和分析客户数据&#xff0c;以深入了解客户行为的过程。企业将利用这些数据来制定与营销、产品开发、销售等相关的业务决策。 通过客户分析&#xff0c;你可以做出简单的业务决策&#xff0c;比如找出投资回报率…

景联文科技数据标注平台助力AI数据实现价值最大化

随着人工智能技术不断进步&#xff0c;应用领域不断拓宽&#xff0c;对于高质量、大规模标注数据的需求也在不断增加。 数据标注是人工智能行业的基石。机器学习需要运用海量的有效数据来做支撑&#xff0c;而这些数据就需要我们的标注员对其进行分析和处理&#xff0c;想要得到…

【力扣周赛】第 369 场周赛(⭐记忆化搜索 树形DP)

文章目录 竞赛链接Q1&#xff1a;2917. 找出数组中的 K-or 值竞赛时代码——按题意模拟 Q2&#xff1a;2918. 数组的最小相等和竞赛时代码——分类讨论 Q3&#xff1a;2919. 使数组变美的最小增量运算数⭐⭐⭐竞赛时代码——动态规划解法2——记忆化搜索 翻译成递推 Q4&#xf…

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

带你用uniapp从零开发一个仿小米商场_10.开发一个占剩余窗口的滚动区域

首先是一个头部的tag切换栏,这个很简单,就不多说 源码奉上 <scroll-view scroll-x class"border scroll-row" style"height: 80rpx;"><view class"scroll-row-item" style"height: 80rpx;line-height: 80rpx;" v-for"(…

数学建模之相关系数模型及其代码

发现新天地&#xff0c;欢迎访问小铬的主页(www.xiaocr.fun) 引言 本讲我们将介绍两种最为常用的相关系数&#xff1a;皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数。它们可用来衡量两个变量之间的相关性的大小&#xff0c;根据数据满足的不同条件&#xff0c;我们要…

PyTorch入门教学——加载数据(Dataloader)

1、简介 PyTorch中如何读取数据主要涉及到两个类&#xff0c;分别为Dataset和Dataloader。 Dataset&#xff1a;创建可被Pytorch使用的数据集Dataloader&#xff1a;向模型传递数据本文主要讲解Dataloader的使用方法。 2、Dataloader 2.1、查看使用方法 查看官网文档&#…

matlab simulink PMSM电机转速预估

1、内容简介 略 22-可以交流、咨询、答疑 2、内容说明 PMSM电机转速预估 PMSM电机转速预估 PMSM、转速估计&#xff0c;PID控制 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk1w 提取码&#xff1a;rvol