Java之网络编程

什么是计算机网络

是指将地理位置不同的具有独立功能的计算机设备通过通信连接起来,在网络操作系统、网络管理软件及网络通讯协议的管理与协调下,实现资源共享与信息传递的计算机系统


网络通讯的两个要素

通讯双方的网络地址

1.ip

2.端口号

通过ip+端口号就可以精准定位一台计算机

规则:网络通讯协议

TCP/IP参考模型

1.网络编程中有两个主要的问题

        一、如何精准定位到网络上的一台或多台主机

        二、找到主机之后如何进行通信

2.网络编程中的要素

        一、IP和端口号

        二、网络通信协议

3.万物皆对象,创建类表示Ip和端口号


IP地址

ip地址(InetAddress)

1.唯一定位一台网络上的计算机

2.127.0.0.1:本机localhost

3.IP地址的分类

        一、ipv4 / ipv6

                IPV4 127.0.071,4个字节组成

        二、公网-私网

InetAddress类,互联网协议(ip)对象

创建对象:InetAddress 引用变量  =  InetAddress.getByName("ip地址");

获取本机地址的三种方式:

1.InetAddress.getByName("127.0.0.1")

2.InetAddress.getByName("localhost")

3.InetAddress.getLocalHost()

查询网站IP地址

InetAddress.getByName("域名")

三种常用方法:

1.InetAddress变量.getCanonicalHostName()   获取对象的规范地址(IP)

2.InetAddress变量.getHostAddress()        获取变量的ip地址

3.InetAddress变量.getHostName()        获取变量域名

例子:

import java.net.InetAddress;
import java.net.UnknownHostException;//测试ip
public class Demo {public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);//查询网站Ip地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);//常用方法System.out.println(inetAddress2.getAddress());//规范的名字System.out.println(inetAddress2.getCanonicalHostName());//ipSystem.out.println(inetAddress2.getHostAddress());//域名System.out.println(inetAddress2.getHostName());} catch (UnknownHostException e) {throw new RuntimeException(e);}}
}

端口Port

端口表示计算机上的一个程序的进程

1.不同的进程有不同的端口号,用来区分软件

2.端口号被规定范围0~65535

3.TCP,UDP:两个范围都是65535        单个协议下,端口号不能冲突,即TCP协议下端口号为80,UDP协议下端口号也能为80,但是相同协议下端口号不能相同

4.端口分类:

        一、共有端口0~1023

                常用协议访问网站端口号

                ·HTTP:80

                ·HTTPS:443

                ·FTP:21

                ·Telent:23

        ·程序注册端口:1024~49151,分配给用户或程序

                ·Tomcat:8080

                ·MySQL:3306

                ·Oracle:1521

        动态、私有端口:49152~65535不要使用

netstat -ano        #查看所有端口

netstat -ano|finder "端口值"   #查看指定端口

tasklist|findstr "端口值"  #查看指定端口的进程

以上命令在CMD控制台中使用

ctrl+shift+ESC  打开任务管理器

获取端口值的方法:引用变量.getPort()

InetSocketAddress定义协议对象

InetSocketAddress  引用变量  =  new  InetSocketAddress("hostname",port);


通信协议

协议:约定,如同普通话

网络通信协议:速率、传输码率、代码结构、传输控制.....

TCP/IP协议簇:实际上是一组协议

重要:

        1.TCP:用户传输协议(可以理解为打电话)

        一、连接、稳定

        二、分为客户端、服务端

        三、传输完成就释放连接,效率低

        四、三次握手(建立连接)四次挥手(断开连接)

至少需要三次交互,才能保证稳定连接

A:你在吗?

B:我在

A:连接!

挥手

A:我要走了

B:你要走了吗?

B:你真的要走了吗?

A: 我真的要走了

        2.UDP:用户数据报协议 (可以理解为发短信)

        一、不连接、不稳定

        二、客户端和服务端没有明确界限 

        三、不管是否对方准备好接收,都可以发给对方


TCP实现聊天

首先要做好客户端与服务端

客户端

1.连接服务器(Socket)

2.发送消息至服务器

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;//客户端
public class TcpClientDemo01 {public static void main(String[] args) {Socket socket = null;OutputStream os = null;try {//1.要知道服务器的地址InetAddress serverIP = InetAddress.getByName("127.0.0.1");int port = 9999;//2.创建一个socket连接socket = new Socket(serverIP,port);//3.发送消息 IO流os = socket.getOutputStream();os.write("hello!How are you?".getBytes());} catch (Exception e) {e.printStackTrace();}finally {try {os.close();} catch (IOException e) {throw new RuntimeException(e);}try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

服务器

1.建立服务端口(ServerSocket)

2.等待用户连接(accept)

3.接收用户的消息

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务端
public class TcpServerDemo01 {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;ByteArrayOutputStream baos = null;InputStream is = null;try {//1.得有一个地址serverSocket = new ServerSocket(9999);//2.等待客户端连接过来socket = serverSocket.accept();//3.读取客户端的消息is = socket.getInputStream();//管道流baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}System.out.println(baos.toString());} catch (IOException e) {throw new RuntimeException(e);}finally {//关闭资源if (baos!=null){try {baos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (is!=null){try {is.close();} catch (IOException e) {throw new RuntimeException(e);}}if (socket!=null){try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (serverSocket!=null){try {serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}

TCP实现文件上传

接收端:
 

import java.net.DatagramPacket;
import java.net.DatagramSocket;//还是要等待客户端的连接
public class UdpService {public static void main(String[] args) throws Exception{//开放端DatagramSocket socket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);socket.receive(packet);  //阻塞接收System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0,packet.getLength()));//关闭连接socket.close();}
}

发送端:

import java.net.*;//UDP不需要连接服务器
public class UdpClient {public static void main(String[] args) throws Exception{//1.建立一个SocketDatagramSocket socket = new DatagramSocket();//2.建个包String msg = "hello,Service!";InetAddress localhost = InetAddress.getByName("localhost");int port =9090;//参数:数据,数据的起始位置,何处结束,要发送给谁,端口号DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);//3.发送包socket.send(packet);//4.关闭流socket.close();}
}

UDP实现消息发送

发送端:

import java.net.*;//UDP不需要连接服务器
public class UdpClient {public static void main(String[] args) throws Exception{//1.建立一个SocketDatagramSocket socket = new DatagramSocket();//2.建个包String msg = "hello,Service!";InetAddress localhost = InetAddress.getByName("localhost");int port =9090;//参数:数据,数据的起始位置,何处结束,要发送给谁,端口号DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);//3.发送包socket.send(packet);//4.关闭流socket.close();}
}

接收端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;//还是要等待客户端的连接
public class UdpService {public static void main(String[] args) throws Exception{//开放端DatagramSocket socket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);socket.receive(packet);  //阻塞接收System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0,packet.getLength()));//关闭连接socket.close();}
}

UDP实现聊天

DatagramSocket        使用的是UDP连接,不需要连接就可以发送数据给指定服务器

DatagramPacket        用于打包需要发送的数据,它有两个构造函数

1.发送数据构造函数

DatagramPacket(byte[]  buffer,int  length,InetAddress  address,int  port)

把长度为length的数据包buffer发送到address主机的port端口

2.接收数据构造函数

DatagramPacket(byte[]  buffer,int  length)

接收长度为length的数据储存到buffer中

getBytes()

1.无参,将字符串转换为字节数组,返回一个byte数组,其中每个字节都表示字符串中相应位置的字符

2.有参,传入一个字符编码方式charseName作为参数,将字符传转换为字节数组

BufferedReader类:是java io中的一个类,它是一个带缓冲区的字符输入流,用于从字符输入流中读取字符。主要作用是读取文本文件中的字符数据,可以读取文件中的每一行数据

成员方法:

1.readLine()        从缓存中读取一行文本,并返回String类型的结果

2.read()               从缓存中读取一个字符,并返回读取字符的ASCII码值,如果已经到达流的末尾,则返回-1

3.read(char[]  cbuf,int  off,int  len)        从缓存中读取字符,并将字符复制到指定字符数组cbuf中,偏移量为off,长度为len

4.close()              关闭字符流

构造方法:

1.BufferedReader(Reader  in)        创建一个缓冲字符输入流对象,并选择指定字符输入流对象in作为其实际数据源

2.BufferedReader(Reader  in,int  size)        创建一个缓冲字符输入流对象,并选择字符输入流对象in作为其实际数据源,同时指定缓冲区大小size

InputStreamReader:将一个字节的输入流转换为字符的输入流

OutputStreamWriter :将一个字节的输出流转换为字符的输出流

String类用法

String(char[]  value,int  index,int  count)

把字符数组中的一部分数据封装成字符串对象,从下表index~count 

发送端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class UdpSender {public static void main(String[] args) throws Exception{DatagramSocket socket = new DatagramSocket(8888);//准备数据:控制台读取System.inBufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true){String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));socket.send(packet);if (data.equals("bye")){break;}}socket.close();}
}

接收端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpReceiver {public static void main(String[] args) throws Exception{DatagramSocket socket = new DatagramSocket(6666);while (true){//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0,container.length);socket.receive(packet); //阻塞式接收包裹//断开连接byte[] data = packet.getData();String receiveData = new String(data,0,packet.getLength());System.out.println(receiveData);if (receiveData.equals("bye")){break;}}socket.close();}
}

UPD多线程在线咨询

接收端1:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceive implements Runnable{DatagramSocket socket = null;private int port;private String msgFrom;public TalkReceive(int port,String msgFrom) {this.port = port;this.msgFrom = msgFrom;try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run(){while (true){try {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0,container.length);socket.receive(packet); //阻塞式接收包裹//断开连接byte[] data = packet.getData();String receiveData = new String(data,0,packet.getLength());System.out.println(msgFrom+":"+receiveData);if (receiveData.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}
}

接收端2:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class TalkSend implements Runnable{DatagramSocket socket = null;BufferedReader reader = null;int fromPort;private String toIP;private int toPort;public TalkSend(int fromPort, String toIP, int toPort) {this.fromPort = fromPort;this.toIP = toIP;this.toPort = toPort;try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {String data = reader.readLine();byte[] datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));socket.send(packet);if (data.equals("bye")){break;}} catch (Exception e) {e.printStackTrace();}}socket.close();}
}

对象1:

public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();new Thread(new TalkReceive(8888,"老师")).start();}
}

对象2:

public class TalkTeacher {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}
}

URL下载网络资源

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS域名解析:www.baidu.com转化为IP   xxx.x..x..x

组成:    协议://ip地址:端口/项目名/资源

连接URL:

HttpURLConnection  引用变量 = (HttpURLConnection) url.openConnection() 

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

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

相关文章

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉…

CX341A 安装驱动与刷固件

参考 驱动安装1 DPDK编译:支持Mellanox 25Gbps网卡 - 知乎 NVIDIA Mellanox CX网卡固件、驱动系列操作 - 知乎 驱动安装2 Mellanox网卡驱动安装指南 Mellanox OFED_崇尚匀速 追求极致的技术博客_51CTO博客 驱动与固件: 家用万兆网络指南 6 - 比…

深度学习入门笔记(二)神经元的结构

神经网络的基本单元是神经元,本节我们介绍神经元的结构。 2.1 神经元 一个神经元是由下面 5 部分组成的: 输入:x1,x2,…,xk。权重:w1,w2,…,wk。权重的个数与神经元输入的个数相同。偏移项:可省略。激活函数&#…

【已解决】onnx转换为rknn置信度大于1,图像出现乱框问题解决

前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题…

MySQL之建表操作

华子目录 表操作创建表数据类型文本类型数值类型日期/时间类型Bit数据类型常见数据类型 MySQL存储引擎创建表的三个操作创建表时指定存储引擎,字符集,校对规则,行格式 查看表显示数据库中所有表显示数据库中表的信息(表结构&#…

函数的连续与间断【高数笔记】

【连续】 分类,分几个?每类特点? 连续条件,是同时满足还是只需其一? 【间断】 分类,分几个大类,又分几个小类?每类特点? 间断条件,是同时满足还是只需其一&am…

芯片设计方法学之--握手

1.面向对象 本文主要介绍握手的基本概念,读者可通过该篇文章对握手有个基本概念。也借此机会发表下自己对流水线中的握手反压的一些愚见。更深的理解可期待后续更新; 2. 握手简介 举个简单例子; 上图中sender拉高vld发送有效的数据给recei…

44、WEB攻防——通用漏洞RCE代码执行多层面检测利用

文章目录 RCE分类: REC代码执行:引用脚本代码解析执行。例如,eval(phpinfo();)以php脚本解析phpinfo();。RCE命令执行:脚本调用操作系统命令。例如,system(ver),命令执行能执行系统命令。 RCE漏洞对象&am…

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

Linux的打包压缩与解压缩---tar、xz、zip、unzip

最近突然用到了许久不用的压缩解压缩命令,真的陌生, 哈哈,记录一下,后续就不用搜索了。 tar的打包 tar -cvf 压缩有的文件名称 需要压缩的文件或文件夹tar -cvf virtualbox.tar virtualbox/ tar -zcvf virtualbox.tar virtualbo…

家政小程序开发,重塑家政服务体验

随着科技的飞速发展,小程序已经成为我们日常生活中不可或缺的一部分。而家政服务作为社会生活的重要环节,其数字化转型也正在逐步加速。本文将探讨家政小程序开发的重要性、功能特点以及如何提升用户体验。 一、家政小程序开发的重要性 家政服务行业在…

IDEA生成可执行jar包

1. 进入需要打包的项目,选择 最上方菜单栏的 File → Project Structure 2. 选择 左侧菜单栏 Artifacts → 加号 → JAR → from modules with dependencies 3. 选择入口类 Main Class(点击文件夹图标可以快速选择),点击 OK&#…

Vue3.4+element-plus2.5 + Vite 搭建教程整理

一、 Vue3Vite 项目搭建 说明: Vue3 最新版本已经基于Vite构建,关于Vite简介:Vite 下一代的前端工具链,前端开发与构建工具-CSDN博客 1.安装 并 创建Vue3 应用 npm create vuelatest 创建过程可以一路 NO 目前推荐使用 Vue R…

springboot 拦截器

定义 拦截器类似于javaweb中filter 功能 注意: 只能拦截器controller相关的请求 作用 举一个例子,例如我们在Controller中都有一段业务逻辑,这样我们就可以都统一放在拦截器中 因此拦截器的作用就是将controller中共有代码放入到拦截器中执行,减少co…

游戏开发中的残影效果

引言 游戏开发中的残影效果 大家好,相信大家都玩过三国战纪这款游戏,二十年经典街机,青春重燃! 它里面人物在爆气的时候,移动速度会加快,从而产生一种移形换影的感觉。 残影效果作为一种常见的视觉特效,在增强游戏…

IS-IS P2P网路类型 地址不在同一子网建立邻居关系

拓扑图 由于IS-IS是直接运行在数据链路层上的协议,并且最早设计是给CLNP使用的,IS-IS邻居关系的形成与IP地址无关。但在实际的实现中,由于只在IP上运行IS-IS,所以是要检查对方的IP地址的。如果接口配置了从IP,那么只要…

ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例

ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例 以QA32质量放行程序为例子: 由于这个两个值都在结构RQEVA中,为了方便这里获取整个结构值,最后利用指针指向这个程序的这个结构即可获取当前值&#xf…

orin nx 安装paddlespeech记录

nx配置: 模块 版本说明 CPU 8核 内存 16G Cuda版本 11.4 Opencv版本 4.5.4 Tensorrt版本 5.1 Cudnn版本 8.6.0.166 Deepstream版本 6.2 Python版本 3.8 算力 100T 安装paddlepaddle: 去飞桨官网下载jetpack版本的:下…

服务器运存使用率多少正常?

服务器运存使用率多少正常,这是一个相对主观的问题,因为服务器的正常运行不仅取决于运存使用率,还与服务器的工作负载、应用程序的特性和需求、服务器的配置和用途等多种因素有关。然而,一般来说,大多数服务器在运存使…

ideal打包,如何访问项目根目录的libs中的jar包

参考&#xff1a;idea maven 导入lib中jar 并打包_maven引入lib中的jar包-CSDN博客 解决办法&#xff0c;只需要在pom文件中加入 <includeSystemScope>true</includeSystemScope> <build><!-- <includeSystemScope>true</includeSystemScope&g…