当前位置: 首页 > news >正文

[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与IPv66.什么是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::11018.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,专门为组织机构内部使用,以此节省IP9.私有地址是公网地址吗?
比如在网吧中,不是每一台电脑都有一个公网的IP,一般是共享同一个公网IP,再由路由器给每台电脑分配局域网IP,由此节约IP10.特殊IP:127.0.0.1:也可以是localhost是什么地址?
是送回地址,也是本地回环地址,成为本机IP,永远只会寻找当前所在的本机
如果电脑要发送消息:假如自己的Ip是192.168.1.100,如果发消息给自己这个IP,要先发送到路由器,再由路由器分配消息
不是每个路由器分配给你的IP是一样的,自己给自己发送数据就写127.0.0.111.常见的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();}
}

 

相关文章:

[Java学习日记]网络编程

目录 一.常见的软件架构、网络编程三要素、IP 二.利用UDP发送与接收数据 三.改聊天室 四.组播案例 五.TCP通信案例 一.常见的软件架构、网络编程三要素、IP 网络编程:在网络通信协议下,不同的计算机上运行的程序进行的数据传输 在Java中可以使用java…...

spring boot mybatis TypeHandler 看源码如何初始化及调用

目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17,my…...

数据结构基础(带头节点的双向循环链表)

完整代码 DLinkList.hDLinkList.ctest.c DLinkList.h #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int ElemType;// SList - 单链表 // DList - 双链表 // 带头节点的双向循环链表 - 最优链表结构&#xff0c;任意位置…...

STM32CubeMx+MATLAB Simulink点灯程序

STM32CubeMxMATLAB点灯程序 ✨要想实现在MATLAB Simulink环境下使用STM32&#xff0c;前提是已经搭建好MATLAB环境并且安装了必要的Simulink插件&#xff0c;以及对应的STM32支持包。 &#x1f33f;需要准备一块所安装支持包支持的STM32开发板. &#x1f516;具体支持包详情页…...

【深度学习】gan网络原理生成对抗网络

【深度学习】gan网络原理生成对抗网络 GAN的基本思想源自博弈论你的二人零和博弈&#xff0c;由一个生成器和一个判别器构成&#xff0c;通过对抗学习的方式训练&#xff0c;目的是估测数据样本的潜在分布并生成新的数据样本。 1.下载数据并对数据进行规范 transform tran…...

springboot参数汇总

multipart multipart.enabled 开启上传支持&#xff08;默认&#xff1a;true&#xff09; multipart.file-size-threshold: 大于该值的文件会被写到磁盘上 multipart.location 上传文件存放位置 multipart.max-file-size最大文件大小 multipart.max-request-size 最大请求…...

【算法刷题】Day9

文章目录 611. 有效三角形的个数题干&#xff1a;题解&#xff1a;代码&#xff1a; LCR 179. 查找总价格为目标值的两个商品题干&#xff1a;题解&#xff1a;代码&#xff1a; 1137. 第 N 个泰波那契数题干&#xff1a;原理&#xff1a;1、状态表示&#xff08;dp表里面的值所…...

LangChain的函数,工具和代理(三):LangChain中轻松实现OpenAI函数调用

在我之前写的两篇博客中:OpenAI的函数调用,LangChain的表达式语言(LCEL)中介绍了如何利用openai的api来实现函数调用功能&#xff0c;以及在langchain中如何实现openai的函数调用功能&#xff0c;在这两篇博客中&#xff0c;我们都需要手动去创建一个结构比较复杂的函数描述变量…...

WiFi概念介绍

WiFi概念介绍 1. 什么是WLAN2. 什么是Wi-Fi3. Wi-Fi联盟4. WLAN定义范围5. WiFi协议体系6. 协议架构7. WiFi技术的发展7.1 IEEE802.117.2 802.11标准和补充 8. 术语 1. 什么是WLAN Wireless Local Area Network&#xff0c;采用802.11无线技术进行互连的一组计算机和相关设备。…...

如何优雅的进行业务分层

1.什么是应用分层 说起应用分层&#xff0c;大部分人都会认为这个不是很简单嘛 就controller&#xff0c;service, mapper三层。 看起来简单&#xff0c;很多人其实并没有把他们职责划分开&#xff0c;在很多代码中&#xff0c;controller做的逻辑比service还多,service往往当…...

C++的std命名空间

总以为自己懂了&#xff0c;可是仔细想想&#xff0c;多问自己几个问题&#xff0c;发现好像又不是很清楚 命名空间&#xff08;Namespace&#xff09;是C中一种用于解决命名冲突问题的机制&#xff0c;它能够将全局作用域划分为若干个不同的区域&#xff0c;每个区域内可以有…...

unity学习笔记

一、射线检测 如何让鼠标点击某个位置&#xff0c;游戏角色就能移动到该位置&#xff1f; 实现的原理分析&#xff1a;我们能看见游戏的东西就是摄像机拍摄到的东西&#xff0c;所以摄像机的镜平面就是当前能看到的了。 那接下来我们可以让摄像机发射一条射线&#xff0c;鼠标…...

使用SpringBoot和ZXing实现二维码生成与解析

一、ZXing简介 ZXing是一个开源的&#xff0c;用Java实现的多种格式的1D/2D条码图像处理库。它包含了用于解析多种格式的1D/2D条形码的工具类&#xff0c;目标是能够对QR编码&#xff0c;Data Matrix, UPC的1D条形码进行解码。在二维码编制上&#xff0c;ZXing巧妙地利用构成计…...

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值&#xff0c;针对不同类型&#xff0c;我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…...

Monkey

一、Monkey的概念 “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人&#xff08;就像猴子一样&#xff09;不需要知道程序的任何用户交互方面的知识&#xff0c;如果给他一个程序&#xff0c;他就会针对他看到的界面进行操作&#xff0c;其操作是无目的的、乱点乱按…...

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…...

算法学习—排序

排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法&#xff0c;它的工作原理很简单&#xff0c;首先从未排序序列中找到最大的元素&#xff0c;放到已排序序列的末尾&#xff0c;重复上述步骤&#xff0c;直到所有元素排序完毕。 2.算法描述 1&#xff…...

在Pycharm中创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...

linux里source、sh、bash、./有什么区别

1、source source a.sh 在当前shell内去读取、执行a.sh&#xff0c;而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意&#xff1a;中间是有空格的。 2、sh/bash sh a.sh bash a.sh 都是打开一个subshell去读取、执行a.sh&#xff0c;而a.…...

IDEA编译器技巧-提示词忽略大小写

IDEA编译器技巧-提示词忽略大小写 写代码时,每次创建对象都要按住 Shift 字母 做大写开头, 废手, 下面通过编译器配置解放Shift 键 setting -> Editor -> General -> Code Completion -> Match case 把这个√去掉, 创建对象就不需要再按住 Shift 键 示例: 1.…...

【MySQL】MySQL安装 环境初始化

MySQL安装 MYSQL官网 安装完成后,傻瓜下一步即可 配置一下环境变量即可 (1) 初始化MySQL, 管理员身份运行 mysqld --initialize-insecure(2) 注册 mysqld mysqld -install# 如果记录以前的版本执行下面指令 mysqld -remove(3) 启动MySQL服务 // 启动mysql服务 net start …...

C# IList 与List区别二叉树的层序遍历

IList 接口&#xff1a; IList 是一个接口&#xff0c;定义了一种有序集合的通用 API。继承自 ICollection 接口和IEnumerable<T>&#xff0c;是所有泛型列表的基接&#xff0c;口它提供了对列表中元素的基本操作&#xff0c;如添加、删除、索引访问等。IList 不是一个具…...

助力android面试2024【面试题合集】

转眼间&#xff0c;2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难&#xff0c;那么想必找工作也不好找&#xff0c;在我们android开发这一行业非常的卷&#xff0c;在各行各业中尤为突出。android虽然不好过&#xff0c;但不能不吃饭吧。卷归卷但是还得干…...

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…...

对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述

A survey of the Vision Transformers and its CNN-Transformer based Variants 摘要1、介绍2、vit的基本概念2.1 patch嵌入2.2 位置嵌入2.2.1 绝对位置嵌入(APE)2.2.2 相对位置嵌入(RPE)2.2.3卷积位置嵌入(CPE) 2.3 注意力机制2.3.1多头自我注意(MSA) 2.4 Transformer层2.4.1 …...

MongoDB简介

数据库&#xff0c;顾名思义&#xff0c;是保存数据的地方。中华文化博大精深&#xff0c;短短3个文字&#xff0c;就定义了一个强大的数据管理和读写方式出来。数据库&#xff0c;管理的对象是数据。称为库&#xff0c;表示数据在库中有组织&#xff0c;相互之间有微妙的关系。…...

尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包

jdk文件百度云下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MCiGRzOZY8rAFpRJwA3tdw 提取码&#xff1a;kphl hadoop的jar包&#xff1a; 最新版官网链接&#xff1a; Index of /dist/hadoop/core/stable (apache.org) 百度云下载&#xff0c;3.3.3版&#xf…...

vue el-radio-group多选封装及使用

基于Element UI库的Vue组件&#xff0c;实现了一个单选/多选框组合的效果&#xff0c;可以根据 type 属性的不同值来切换单选框&#xff08;默认&#xff09;和按钮式单选框/多选框。 创建组件index.vue (src/common-ui/radioGroup/index.vue) <template><el-radio-g…...

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础&#xff08;卷积&#xff0c;池化&#xff0c;激活&#xff0c;全连接&#xff09; - 知乎 PyTorch 入门与实践&#xff08;六&#xff09;卷积神经网络进阶&#xff08;DenseNet&#xff09;_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…...

TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印

最近淘到了一个TPLink-Wr702N路由器&#xff0c;而且里面已经刷机为OpenWrt系统了&#xff0c;刚好家里有一台老的USB打印机&#xff0c;就想这通过路由器将打印机改为无线打印机&#xff0c;一番折腾后&#xff0c;居然成功了&#xff0c;这里记录下实现过程&#xff0c;为后面…...