java学习----网络编程
网络编程入门
网络编程概述
计算机网络
计算机网络是指地理位置不同的具有独立功能的计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理协调下,实现资源共享和信息传递的计算机系统。
(客户端和服务器通过互联网连接起来实现资源共享和信息传递)
网络编程
网络编程
在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换。
网络编程的三要素
IP地址
要想让网络中的计算机能够相互通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机和识别发送的计算机,IP地址就是标识号,也就是设备的标识。
端口:端口号是可以唯一表示设备中的应用程序
协议:通过计算机网可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,他对数据的传输格式,传输速率,传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换,常见的协议有UDP协议和TCP协议。
IP地址
网络中设备的唯一标识
IP地址分两大类
-
IPv4
是给每个连接在网络上的主机分配一个32bit的地址,按照TCP/IP规定,ip地址用二进制来表示是,每个地址 长32bit,也就是四个字节.为了使用方便,IP地址常被写成十进制的形式,中间有都好分割不同的字节,这种表示方法叫做点分十进制表示法。
-
IPv6
由于互联网发展,IP地址需求量增大,网络地址数量有限,为了扩大地址空间,通过IPv6重新定义地址空间,采用128位的地址长度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题
常用命令
ipconfig:查看本机IP地址
ping ip地址:检查网络是否连通
特殊的IP地址
127.0.0.1:是霍总地址,可以代表本机地址,一般用来测试
InetAddress的使用
InetAddress表示Internet协议(IP)地址
使用方式代码如下
public static void main(String[] args) throws UnknownHostException {InetAddress address = InetAddress.getByName("192.168.137.1");//获取IP地址的主机名String name = address.getHostName();//返回文本显示的IP地址字符串String hostAddress = address.getHostAddress();System.out.println("主机名:"+name);System.out.println("ip地址:"+hostAddress);}
端口
端口:设备上应用程序的唯一标识
端口号:用两个字节表示的整数,他的取值范围是065535.其中,01023之间的端口号用于一些知名
网络服务和应用,普通应用程序需要使用1024以上的端口号。如果端口号被另一个服务或应用占用。会导致当前程序启动失败。
协议
协议:计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议
-
用户数据报协议(User Datagram Protocol)
-
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另一台计算机发送数据时,发送端不会去确认接收端是否存在,就会发送出数据,同样接受端在接受到数据是,也不会向发送端反馈是否收到数据
由于使用UDP协议消耗较小,通信效率高,所以通常会用于音频,视频和普通数据的传输。
-
例如视频会议一般采用UDP协议,因为这种情况即使偶尔丢失一两个数据包。也不会对数据结果产生影响。但是在使用UDP协议传输数据时,由于UDP协议的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议
- 传输控制协议(Transmission Control Protocol)
- TCP协议是面向连接的协议,即传输数据之前,在发送端和接收端建立逻辑联系,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手。
- 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠性。
- 第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
- 第二次握手:服务器端向客户端会送一个响应 ,通知客户端收到了连接请求
- 第三次握手,客户端再次向服务器端发送确认信息,确认连接
- 完成 三次握手,建立连接后,客户端和服务器端可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全性,所以应用十分广泛,例如上传文件,下载文件,浏览网页等。
UDP通信程序
UDP通信原理
UDP协议是一种不可靠的网络协议,它在网络的两端个简历一个Socket对象.但是这两个Socket只是发送,接受数据的对象.因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念.
Java 提供了DatagramSocket类作为基于UDP协议的Socket.
UDP发送数据
发送数据的步骤
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据并把数据打包
- 调用DatagramSocket对象发送数据
- 关闭发送端
public static void main(String[] args) throws IOException {//创建Socket对象DatagramSocket ds=new DatagramSocket();//创建数据,并把数据打包//DatagramPacket(byte[] buf, int length, InetAddress address,// int port) 构造一个数据包,// 发送长度为 length的数据包到指定主机上的指定端口号。byte[] bys="超级喜欢菲菲".getBytes();int length=bys.length;InetAddress inetAddress = InetAddress.getByName("192.168.37.1");int port=10087;DatagramPacket dp=new DatagramPacket(bys,length,inetAddress,port);//调用DatagramSocket对象的方法发送数据//void send(DatagramPacket p) 从此套接字发送数据报包。ds.send(dp);//关闭发送端//void close() 关闭此数据报套接字。ds.close();}
UDP接收数据
UDP接收数据的步骤
- 创建接收数据端DatagramSocket对象
- 创建一个数据包,用于接收数据
- 调用DatagramSocket对象的方法接收数据
- 解析数据包,并把数据在控制台上显示
- 关闭接收端
TCP通信程序
TCP通信协议是一种可靠的网络协议,他在通信的两端个简历一个Socket对象,从而在通信的两端形成虚拟链路。
一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟的链路进行通信。
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表连段的通信端口,并通过Socket产生的IO流来进行网络通信
Java为客户端童工了Socket类,为服务提供了ServerSocket类
TCP发送数据
发送数据步骤
- 创建客户端的Socket对象
- 获取输出流,写数据
- 释放资源
public static void main(String[] args) throws IOException {//创建客户端的Socket对象//Socket()InetAddress address.int port)创建流套接字并将其链接到指定的IP地址的指定端口号//Socket s=new Socket(InetAddress.getByName("192.168.43.240"),10001);Socket s=new Socket("192.168.43.1",10086);//获取数据流,写数据OutputStream os = s.getOutputStream();os.write("Mulujet".getBytes());//释放资源s.close();}
TCP接收数据
接受数据的步骤
-
创建服务器端的Socket对象
-
监听客户端连接,并返回一个Socket对象
-
获取输入流,读数据,并把数据显示在控制台
-
释放资源
public static void main(String[] args) throws IOException {//创建服务区端Socket对象ServerSocket ss=new ServerSocket(10086);//监听发送端Socket s = ss.accept();//读数据,并显示在控制台InputStream is = s.getInputStream();byte [] bys=new byte[1024];int len=is.read(bys);String data=new String(bys,0,len);System.out.println("数据是:"+data);//释放资源s.close();ss.close();}
TCP通信程序的练习
package practise1.Demo5;import java.io.*;
import java.net.Socket;public class ServerThread implements Runnable {private Socket s;int count=0;public ServerThread(Socket s) {this.s=s;}@Overridepublic void run() {//接收数据写道文本文件try {BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//BufferedWriter bw=new BufferedWriter(new FileWriter(file));File file=new File("E:\\Java\\IP\\src\\practise1\\Demo5\\123["+count+"].java");while(file.exists()){count++;file=new File("E:\\Java\\IP\\src\\practise1\\Demo5\\123["+count+"].java");}BufferedWriter bw=new BufferedWriter(new FileWriter(file));String line;while((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}//给出反馈BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();s.close();} catch (IOException e) {throw new RuntimeException(e);}}
}package practise1.Demo5;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {ServerSocket ss=new ServerSocket(10098);while(true){//监听客户端连接Socket s = ss.accept();//为每一个客户端开启一个线程new Thread(new ServerThread(s)).start();}}
}package practise1.Demo5;import java.io.*;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {Socket s=new Socket("192.168.137.1",10098);String file="E:\\Java\\IP\\src\\practise1\\UDPReceiveDemo.java";//封装文本文件数据BufferedReader br=new BufferedReader(new FileReader(file));//封装输出流写数据BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();bw.flush();}s.shutdownOutput();//接收反馈BufferedReader brClient=new BufferedReader(new InputStreamReader(s.getInputStream()));String data=brClient.readLine();System.out.println("服务器的反馈:"+data);//释放资源br.close();s.close();}
}
连接:三次握手
取消连接:四次挥手
服务器端的优化
- 用循环优化
- UUID 不可变的通用唯一标识符的类
- 线程
- 线程池
package practise2.ThreadPool;import java.io.*;
import java.net.Socket;//将本地文件上传到服务器,接收服务器的反馈
public class Client {public static void main(String[] args) throws IOException {Socket socket=new Socket("172.18.45.241",10098);//是本地的流,用来读取本地文件的BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\QQ363\\Desktop\\1.jpg"));//写到服务器中要用网络的流OutputStream os = socket.getOutputStream();//包装提高效率BufferedOutputStream bos=new BufferedOutputStream(os);int b;while ((b=bis.read())!=-1){bos.write(b);//通过网络写到服务器中}//给服务器一个结束标识,文件已经传输socket.shutdownOutput();//接受反馈BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while((line=br.readLine())!=null){System.out.println(line);}socket.close();bis.close();socket.close();}
}package practise2.ThreadPool;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;//接收客户端上传的问价你,上传完毕之后给出反馈
public class Server {public static void main(String[] args) throws IOException {ServerSocket ss=new ServerSocket(10098);//创建线程池ThreadPoolExecutor pool=new ThreadPoolExecutor(3, //核心线程数量10,//线程池的总数量60,//临时线程空闲时间TimeUnit.SECONDS,//单位new ArrayBlockingQueue<>(5),//阻塞队列Executors.defaultThreadFactory(),//创建线程的方式new ThreadPoolExecutor.AbortPolicy()//任务拒绝策略);while(true) {Socket accept = ss.accept();SocketThread st=new SocketThread(accept);pool.submit(st);}}
}package practise2.ThreadPool;import java.io.*;
import java.net.Socket;
import java.util.UUID;public class SocketThread implements Runnable{private Socket accept;public SocketThread(Socket accept) {this.accept=accept;}@Overridepublic void run() {BufferedOutputStream bos=null;try {//网络中的流,从客户端读取数据BufferedInputStream bis=new BufferedInputStream(accept.getInputStream());//本地的IO流,把数据写到本地中,实现永久化储存bos=new BufferedOutputStream(new FileOutputStream("E:\\Java\\IP\\src\\practise2\\demo2\\"+ UUID.randomUUID().toString()+".jpg"));int b;while((b=bis.read())!=-1){bos.write(b);}//给出反馈BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));bw.write("上传成功!");bw.newLine();bw.flush();} catch (IOException e) {throw new RuntimeException(e);}finally {if (bos!=null){try {bos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (accept!=null){try {accept.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
相关文章:

java学习----网络编程
网络编程入门 网络编程概述 计算机网络 计算机网络是指地理位置不同的具有独立功能的计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理协调下,实现资源共享和信息传递的计算机系统…...
这些「误区」99%的研发都踩过
意识不到误区的存在最为离谱; 01生活中,职场上,游戏里,都少不了正面对喷过:意识太差; 在个人的认知中意识即思维,意识太差即思维中存在的误区比较多; 每个人或多或少都存在思维上的…...

Bi系统跟数据中台的区别是什么?
随着数据时代的发展,BI分析是当今数据时代必不可少的能力之一。BI系统通过系统化产品化的方法,能够大幅降低数据的获取成本、提升数据使用效率。同时借助可视化、交互式的操作,可以高效支持业务的分析及发展。 BI如此火热,随之而…...

微信小程序反编译方法分享
文章目录一、前言二、准备工作(一)安装Nodejs(二)解密和逆向工具三、小程序缓存文件解密(一)定位小程序缓存路径(二)源码解密(三)源码反编译四、小结一、前言…...

有了这些接口测试用例+工具,测试效率想不提升都难
写在前面:在日常开发过程中,有人做前端开发,有人负责后端开发。接口的主要作用就是连接前后台。但是,由于前端和后端开发的速度可能不一样,尤其是后端开发好了,但前端还未开发。这种时候我们需要做接口测试…...

麒麟 arm架构安装nginx
目录 1、下载nginx安装包并解压 在线安装: 离线安装: 上传nginx安装包(下载地址:https://nginx.org/download/nginx-1.20.2.tar.gz)到指定目录 2、安装系统相关依赖软件、组件包 1、上传或者下载对应的组件包 2、安…...
logrotate失效的排查---selinux开启状态拦截问题及解决方法
首先测试环境selinux 处于关闭状态 disable # getenforce disable重新开启selinux配置与生产环境一致 [rootlocal]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX can take one of these three values: # enforcing - S…...
Allegro使用总结-查看Layout基本操作:
好久没用CSDN写过笔记了,没想到无意间打开,编辑器更新啦!以前巨难用的“富文本编辑器”终于改观了😭变的好像语雀,うれしい1. 视图/画面操作a. 画面缩放(Zoom):F11/F12 或 鼠标滚轮b…...
cmd del命令笔记
使用 /s 删除文件夹下所有的 del /s sub # 删除目录下所有文件,这个目录不会删除 /p 确认提示 /q 静默模式,不会提示要不要删除 如过和/p同时使用,那么不提示 /a 根据属性删除,a是attribute的意思 del /a:r 01.jpg # 01.jp…...

apifox持续集成+java+企微机器人+xxljob定时推送
总览: apifox做接口测试后,把用例合并组装成测试套件,然后apifox-cli通过终端命令实现把套件执行后,输出本地文件的测试报告html或json。本地解析后拿到有用的解决通过定时执行推送到企微群里。 然后把html一起推到群里。 这个…...

盘点Linux内核网络知识100道题,这篇就够了
计算机网络模型 1、五层因特网协议栈和七层OSI(Open System Interconnections)参考模型分别是什么? 5层:应用层、传输层、网络层、数据链路层、物理层 7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理…...
数据库敏感字段脱敏
文章目录什么是脱敏脱敏后带来什么问题解决方案一解决方案二具体实施方案一方案二存量数据处理什么是脱敏 如果你有申请过一些软件资质,应该会被要求敏感数据进行加密,比如密码不能明文,用户的手机号,身份证信息,银行…...
skynet 游戏服务器探索(1)--熟悉skynet(网络)
因为做游戏服务器开发,大多数都跟脚本打交道,要么是lua,要么是python,要么是php,方便热更新的只有lua与php, php相关的游戏服务器开发,参考我另外的文章https://blog.csdn.net/guoyilongedu/article/details/121049511lua脚本相关的ÿ…...
select、poll、epoll
select、poll、epoll select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int nfds:被select管理的文件描述符的个数,最大描述符编号1fd_set *readfds:读文件描述符集合fd_se…...
rollup的基本使用 基本配置与处理各种文件
rollup rollup是一个javascript的模块化打包工具 可以帮助我们编译小的代码到一个大的负载的代码中 比如一个库或者一个应用 rollup与webpack的区别 rollup主要针对ES Module进行打包 另外webpack通常可以通过各种loader处理各种各样的文件 以及处理他们的依赖关系 rollup更多…...
ubuntu-debian系-redhat系
debian系 包类型:.deb包 本地安装包安装工具:dpkg 本地包管理命令:dpkg -i package 安装包 dpkg -r package 卸载包 dpkg -l package 查看已安装包 远程安装包安装工具:apt / apt-get 远程包管理命令:apt-get apt-cac…...

Altium Designer 18中原理图DRC编译和PCB DRC检查-AD DRC
一、原理图编译 原理图检查的主要内容有: 1、元件位号冲突。也即多个元件编号相同,例如两个电容在原理图中都被命名为C2,显然肯定是无法生成PCB的。 2、网络悬浮。也即网络标号没有附着在电气走线上,一般这种是人操作失误&…...
zipfile — 访问 ZIP 压缩文件
zipfile — 访问 ZIP 压缩文件 1.概述 zipfile 模块可用于操作 ZIP 存档文件,.zip 是 PC 程序 PKZIP 推广的格式 2.测试数据 为了演示用,你需要创建以下三个文件 1.README.txt 内容如下,注意最后一行为空行 The examples for the zipfil…...

检查nmos管是否损坏
NCEP85T14 功率mos管为例 以NMOS举例,只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管,方向为S到D,利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性,可以快速测量MOS好坏。 1、测…...

第七章 - 聚合函数(count,avg,sum,max,min)和一些数学函数
第七章 - 聚合函数使用别名 ascount() 计数avg() 平均值sum() 求和max() 最大值min() 最小值一些数学计算函数Abs()Cos()Exp()Mod()Pi()radians()Sin()Sqrt()Power()Ceil()Floor()使用别名 as 在SQL中可以使用 as 来为一个字段或者一个值设置新的别名下面聚合函数的使用中就会…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...
大模型智能体核心技术:CoT与ReAct深度解析
**导读:**在当今AI技术快速发展的背景下,大模型的推理能力和可解释性成为业界关注的焦点。本文深入解析了两项核心技术:CoT(思维链)和ReAct(推理与行动),这两种方法正在重新定义大模…...