网络编程看这一篇文章就够了

news2024/12/26 21:35:20

第一章 网络编程概述

  • 网络编程概述
1
2
3
Java语言提供了网络的支持,程序员能够很容易的开发常见的网络应用.

Java提供的类库,可以实现无痛的网络连接,联网的底层细节被隐藏在安装Java本机系统里.由JVM进行控制.并且Java实现了一个跨平台的网络库.
  • 网络编程的目的
1
直接或间接地通过网络协议与其它计算机进行通讯,实现资源的共享
  • 网络编程中面临的主要问题
1
2
1. 如何准确地定位网络上一台或多台主机
2. 找到主机后如何可靠高效地进行数据传输

第二章 网络通信要素

第1节 通信双方地址(通信要素1)

1
通讯要素1:IP地址 和 端口号
  • IP地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Java语言提供了InetAddress类用来描述主机信息(IP地址和域名)
IP地址:标识Internet上的计算机 比如百度服务器的IP地址 220.181.38.251 
域名: 计算机的定位标识,由于IP地址不方便记忆,所以可以通过域名映射IP地址,理论上和IP同等功效.

为了标识自己本地主机所以计算机为每一个自己的主机也设置了IP地址和域名(127.0.0.1和localhost),称之为回环地址.

InetAddress: 表示互联网协议 (IP) 地址,有两个典型子类Inet4Address(IPv4地址)和Inet6Address(IPv6地址)

常见方法:
//通过主机名获取主机的InetAddress对象
InetAddress ia = InetAddress.getByName("baidu.com");
System.out.println(ia);//baidu.com/220.181.38.251
//获取主机地址
String address = ia.getHostAddress();
System.out.println(address);//220.181.38.251
//获取主机名称
String name = ia.getHostName();
System.out.println(name);//baidu.com
  • 端口号
1
2
3
标识正在计算机上运行的进程;
同的进程有不同的端口号;
计算机的端口号被规定为一个16位的整数,取值范围为0~65535个.0~1023被服务器占用,我们在编写网络应用时应该使用1024~65535端口号,以免发生端口冲突.
  • 端口号和IP地址组合
1
端口号与IP地址的组合得出一个网络套接字.

第2节 通信规则(通信要素2)

1
计算机网络中实现通信必须有一些约定,即通信协议.对传输频率,数据格式,传输步骤,出错控制等设计的标准.
  • 网络通信协议模型
1
2
OSI参考模型: 模型过于理想化,未能在因特网上进行广泛推广。
TCP/IP参考模型(TCP/IP协议): 事实上的国际标准。
  • 协议模型差异化
OSI参考模型TCP/IP参考模型TCP/IP参考模型各层对应协议
应用层应用层HTTP、ftp、telnet、DNS…
表示层
会话层
传输层传输层TCP、UDP、…
网络层网络层IP、ICMP、ARP…
数据链路层
物理层物理+数据链路层Link
  • 数据封装和数据拆分

 

  • TCP/IP协议簇
TCP/IP协议簇是Internet的基础,也是当今最流行的组网形式.TCP/IP是一组协议的代名词,包括许多别的协议,组成了TCP/IP协议簇.其中比较重要的有PPP协议、IP协议、TCP协议、UDP协议、FTP协议、DNS协议、SMTP协议等

第三章 TCP网络通信

第1节 TCP介绍

1
2
3
4
5
1. 使用TCP协议前,须先建立TCP连接,形成传输数据通道
2. 传输前,采用"三次握手"方式,是可靠的
3. TCP协议进行通信的两个应用进程:客户端、服务端
4. 在连接中可进行大数据量的传输
5. 传输完毕,需释放已建立的连接,效率低(释放连接需要四次挥手)

三次握手建立TCP连接通道

1
2
3
4
5
第1次 客户端向服务器端发送数据,服务器端收到了,然后服务器端返回给客户端一个信息
第2次 客户端接收到服务器端返回的消息(到这里可以知道服务器端可以正确接收和处理客户端消息消息)
第3次 客户端接收到服务器端返回来的消息之后,告诉服务器端我已经接收到了你响应给我的消息.

以上三步完成之后才能证明服务器端和客户端都可以正确接收和处理消息.如果只有1、2步只能证明服务器端正常不能证明客户端正常.

四次挥手释放TCP连接通道

1
2
3
4
第1次 客户端和服务器端说我要关闭连接了
第2次 服务器端说可以,但是你等我一会,我把剩余的任务做完
第3次 服务器端做完收尾工作之后和客户端说,我这边结束了,你可以关了
第4次 客户端说OK,我关了

第2节 Socket介绍

  • Socket介绍
1
2
3
4
5
1. 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准
2. 通信的两端都要有Socket,是两台机器间通信的端点
3. 网络通信其实就是Socket间的通信
4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
  • Socket类
方法功能
void close()关闭Socket,不可在以后的网络连接中使用,除非创建新的套接字
InputStream getInputStream()获取与Socket相关联的字节输入流,用于从Socket中读数据
OutputStream getOutputStream()获取与Socket相关联的字节输出流,用于向Socket中写数据
  • ServerSocket类
方法功能
Socket accept()等待客户端的连接请求,返回与该客户端进行通信用的Socket对象
void close()关闭监听Socket

第3节 基于Socket编程实现cs(client-server)

  • 案例一(实现客户端向服务器端发送一段数据)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//服务器端
public class Server {
    public static void main(String[] args) throws IOException {

        //创建服务器端套接字
        ServerSocket ss = new ServerSocket(6666);
        System.out.println("服务器端已启动,等待客户端连接....");
        //获取服务器端套接字,并监听,等待客户端发送数据
        Socket socket = ss.accept();
        //如果客户端发送过来了数据,获取数据
        InputStream in = socket.getInputStream();
        byte[] buff = new byte[1024];
        int len = in.read(buff);
        System.out.println("接受客户端发送的数据为:"+ new String(buff,0,len));
        socket.close();
        ss.close();
    }
}
//客户端
public class Client {
    public static void main(String[] args) throws IOException {

        //创建客户端套接字
        Socket socket = new Socket("127.0.0.1", 6666);
        //获取套接字输出流
        OutputStream out = socket.getOutputStream();
        //向通道中写入数据
        String msg = "Hello Socket";
        out.write(msg.getBytes());
        socket.close();
    }
}
  • 案例二(实现双向数据)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//服务器端
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(6666);
        System.out.println("服务器端已启动,等待客户端连接....");
        Socket socket = ss.accept();
        InputStream in = socket.getInputStream();
        byte[] buff = new byte[1024];
        int len = in.read(buff);
        System.out.println("我是服务器端-->接收客户端数据为:"+new String(buff,0,len));

        System.out.println("给客户端返回消息开始...");
        //给客户端响应一个接收成功的消息
        String msg = "服务器端接收数据成功";
        OutputStream out = socket.getOutputStream();
        out.write(msg.getBytes());
        //关闭
        socket.close();
        ss.close();
    }
}
//客户端
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 6666);
        OutputStream out = socket.getOutputStream();
        //发送的消息
        String msg = "我是客户端消息";
        out.write(msg.getBytes());

        //接收服务器端数据
        InputStream in = socket.getInputStream();
        byte[] buff = new byte[1024];
        int len = in.read(buff);
        System.out.println("我是客户端-->接收服务器端数据为:"+new String(buff,0,len));

        socket.close();
    }
}
  • 案例三(客户端给服务器端发送一张图片,服务器端将图片保存到本地,并且告诉客户端数据上传成功)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//服务器端
public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(6666);
        System.out.println("服务器端已启动,等待客户端连接....");
        Socket socket = ss.accept();
        System.out.println("服务器端已启动,客户端连接成功....");
        InputStream in = socket.getInputStream();
        byte[] buff = new byte[512];
        int len = 0;
        System.out.println("连接成功,接收来自客户端数据开始....");
        FileOutputStream fout = new FileOutputStream("pic.png");
        while((len=in.read(buff))!=-1) {
        	fout.write(buff, 0, len);
        }
        
        System.out.println("连接成功,接收来自客户端数据完成....");
        System.out.println("给客户端返回消息开始...");
        //给客户端响应一个接收成功的消息
        String msg = "服务器端接收数据成功";
        OutputStream out = socket.getOutputStream();
        out.write(msg.getBytes());;
        //关闭
        out.close();
        fout.close();
        in.close();
        socket.close();
        ss.close();
    }
}
//客户端
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 6666);
        OutputStream out = socket.getOutputStream();
        //读取本地文件
        FileInputStream fin = new FileInputStream("/Users/hushuang/Downloads/wangluobaincheng.png");
        byte[] fbuff = new byte[128];
        int flen=0;
        while((flen=fin.read(fbuff))!=-1) {
        	out.write(fbuff, 0, flen);
        }
        //数据发送完毕
        socket.shutdownOutput();
        
        //接收服务器端数据
        InputStream in = socket.getInputStream();
        byte[] buff = new byte[1024];
        int len = in.read(buff);
        System.out.println("我是客户端-->接收服务器端数据为:"+new String(buff,0,len));
        
        
        in.close();
        fin.close();
        out.close();
        socket.close();
    }
}

第四章 UDP网络通信

第1节 UDP介绍

1
2
3
4
5
类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序
UDP数据报通过数据报套接字DatagramSocket发送和接收
系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达
DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

第2节 UDP实现

1
2
3
4
5
6
7
8
运行流程:
1. DatagramSocket与DatagramPacket
2. 建立发送端,接收端
3. 建立数据包
4. 调用Socket的发送、接收方法
5. 关闭Socket

发送端与接收端是两个独立的运行程序
  • 发送端
1
2
3
4
5
6
7
8
9
10
11
public class Send {
	public static void main(String[] args) throws IOException {
		DatagramSocket ds = new DatagramSocket();
		byte[] bs = "Hello UDP".getBytes();
		//封装数据报
		DatagramPacket dp = new DatagramPacket(bs,0,bs.length,InetAddress.getByName("127.0.0.1"),10000);
		//发送
		ds.send(dp);
		ds.close();
	}
}
  • 接收端
1
2
3
4
5
6
7
8
9
10
11
12
public class Receive {
	public static void main(String[] args) throws IOException {
		DatagramSocket ds = new DatagramSocket(10000);
		byte[] by = new byte[1024];
		DatagramPacket dp = new DatagramPacket(by,by.length);
		//接收
		ds.receive(dp);
		String str = new String(dp.getData(),0,dp.getLength());
		System.out.println(str);
		ds.close();
	}
}

第五章 URL编程

第1节 URL概述

  • URL介绍
URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址.通过URL我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点.浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源
  • URL组成
1
2
3
4
URL的基本结构由5部分组成

<传输协议>://<主机名>:<端口号>/<文件名>
例如: http://192.168.1.100:8080/taobao/index.html

第2节 URL常见API

  • 构造方法
方法介绍
URL(String spec)根据 String 表示形式创建 URL 对象;spec:域名
1
URL url = new URL ("http://www.baidu.com/index.html");
  • 常见方法
方法介绍
getProtocol()获取此URL 的协议名称
getHost()获取该URL的主机名
getPort()获取该URL的端口号
getPath()获取该URL的文件路径
getFile()获取该URL的文件名
getRef()获取该URL在文件中的相对位置
getQuery()获取该URL的查询名
  • 案例一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestDemo {
	public static void main(String[] args) throws IOException {
		URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.petking.cn%2Fupload%2F20200505%2Fe8120b1111d8badc952a035d0b927b8c.jpg&refer=http%3A%2F%2Fwww.petking.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1638798637&t=7b6aa84c4d3ad92708d4ced882a5d976");
		InputStream in = url.openStream();
		FileOutputStream out = new FileOutputStream("/Users/hushuang/Downloads/123.jpg");
		byte[] buff = new byte[1024];
		int len=0;
		while((len=in.read(buff))!=-1) {
			out.write(buff, 0, len);
		}
		out.close();
		in.close();
	}
}

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

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

相关文章

SQL Server注入技巧与提权方式详解

目录 前言 一、SQL Server基础 1. SQL Server 2012安装启动 navicat远程连接 2. SQL Server概念 数据库的组成 数据库中常用对象 默认库介绍 3. T-SQL语言 创建数据库 创建表 插入数据 基础语法总结 4. sqlserver权限 新建用户并赋予权限 权限总结 二、Sqlser…

4.1 集成运算放大电路概述

集成电路以半导体单晶硅为芯片&#xff0c;采用专门的制造工艺&#xff0c;把晶体管、场效应管、二极管、电阻和电容等元件及它们之间的连线所组成的完整电路制作在一起&#xff0c;使之具有特定的功能。集成放大电路最初多用于各种模拟信号的运算&#xff08;如比例、求和、求…

RabbitMQ 管理界面操作说明

RabbitMQ 管理界面操作说明 当我们安装好RabbitMQ&#xff0c;并开启了rabbitmq_management插件并重启RabbitMQ服务后,我们就可以访问管控台了。 #启动后台管理 [rootVM-0-9-centos sbin]#rabbitmq-plugins enable rabbitmq_management rabbitmq_management开启后&#xff0…

Java流程控制语句-学习笔记

目录 第一章 流程控制语句 1.1 流程控制语句分类 1.2 顺序结构 第二章 判断语句&#xff1a;if语句 2.1 if语句格式1 2.2 if语句格式2 2.3 if语句格式3 第三章 switch语句 3.1 格式 3.2 执行流程&#xff1a; 3.3 switch的扩展知识&#xff1a; 第四章 循环结构 4…

win11+wsl2+kind安装k8s

win11wsl2安装k8s 1. 安装docker w11上面安装docker-desktop的方案&#xff0c;具体的安装步骤&#xff1a; 先开启系统的镜像支持更新wsl设置默认版本为2安装docker-desktop&#xff0c;修改安装位置等&#xff0c;否则就是安装在c盘中 https://blog.csdn.net/weixin_4391…

【机器学习】李宏毅-判断年收入

李宏毅-判断年收入1 实验目的 本次作业的数据是加州大学尔湾分校机器学习作业中下载得到&#xff0c;使用Classification中的生成模型generative model以及logistic regression解决二分类问题。 根据已有数据&#xff0c;判断该人年收入是否大于5万美元&#xff0c;最终得到预…

leetcode 23[python3]几种方法的思考与总结

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 输入&#xff1a; lists [[1,4,5],[1,3,4],[2,6]]输出&#xff1a;[1,1,2,3,4,4,5,6]解释&#xff1a;链表数组如下&#xff1a;[ 1…

⚡️【linux】linux编辑器-VIM的高频使用,快快收藏起来!

⚡️目录 1️⃣VIM最小集 2️⃣VIM指令集 3️⃣VIM的配置 &#x1f332;前言&#xff1a;VIM和VI的区别简单点来讲&#xff0c;他们都是多模式编辑器&#xff0c;不同的是VIM是VI的升级版本&#xff0c;它不仅兼容VI的所有指令&#xff0c;而且还有一些新的特征在里面。例如语…

录屏软件哪个好?试试这6款录屏软件,小编亲测(2023已更新)

对于很多小伙伴来说&#xff0c;电脑录屏是经常需要使用的技能。面对网络上眼花缭乱的录屏软件&#xff0c;究竟哪个录屏软件好用呢&#xff1f;录屏软件哪个好&#xff1f;今天&#xff0c;小编分享亲自测试的这6款录屏软件给你&#xff0c;一起来看看吧。 录屏软件1&#xff…

DevSecOps“内置安全保护”,让软件研发“天生健康”

前言 随着DevOps的发展&#xff0c;DevOps大幅提升了企业应用迭代的速度。但同时&#xff0c;安全如果不能跟上步伐&#xff0c;不仅会抵消DevOps变革带来的提升&#xff0c;拖慢企业数字化转型进程&#xff0c;还会导致漏洞与风险不约而至。所以安全能力在全球范围内受到的重…

4款宝藏国产软件,装了就舍不得卸载,白嫖必备

提到国产软件&#xff0c;许多人想到“流氓、捆绑、广告多”&#xff0c;事实上国产良心软件非常多&#xff0c;如下面几款&#xff0c;每一个都功能强大&#xff0c;最重要还免费使用。 1、原本&#xff08;图片处理神器&#xff09; 日常生活与工作中&#xff0c;经常需要拍摄…

C++单例模式 : 懒汉模式 与 饿汉模式

单例模式&#xff1a; 只能有一个实例&#xff0c;有懒汉和饿汉区分&#xff0c;实现核心思想&#xff1a; 1.构造函数私有化 2.使用静态函数作为接口来获取类对象 1、懒汉模式&#xff1a; 由调用者实例&#xff0c;多线程情况下会存在线程安全问题&#xff0c;需要加互斥锁进…

寒冬已过,2023抓住IT复苏新机会

随着疫情防控进入新的阶段&#xff0c;2023年经济将逐渐回暖&#xff0c;许多行业也将迎来IT需求复苏的新机会。本期&#xff0c;我们就以互联网&#xff0c;金融和房地产这3个支柱行业近期的实际案例&#xff0c;来说明在在线文档领域的新机会。案例1:某互联网集团A公司&#…

数据结构---二叉树路径问题

二叉树路径问题二叉树所有路径分析JAVA实现力扣提交找到一个和为sum的到达叶子节点的路径分析JAVA实现力扣提交求路径&#xff08;中间一段&#xff09;C实现打印根节点到任意节点的路径JAVA实现二叉树所有路径 257二叉树所有路径 分析 前序遍历二叉树递归实现回溯 深度优先搜…

容器化——Centos下部署最后一版支持Docker的k8s集群

部署版本 首先要确定部署的版本 查询Kubernetes对Docker支持的情况 kubernetes/dependencies.yaml at master kubernetes/kubernetes (github.com) 查询Kubernetes Dashboard对Kubernetes支持的情况 Releases kubernetes/dashboard (github.com) 名称版本kubernetes1.23Doc…

如何对CentOS7配置静态IP

CentOS配置静态IP一、检测配置成功的方法1.虚拟机能访问互联网2.虚拟机和物理机可以相互ping通二、配置步骤1.查看物理机IP2.配置虚拟机网络模式3.设置NAT模式网段4.编辑修改配置文件5.测试三、报错解决方案1.网络重启失败2.ping不通一、检测配置成功的方法 1.虚拟机能访问互联…

MyBatis的五种批量查询

一.直接循环插入 RestController RequestMapping("/mybatis3/user") RequiredArgsConstructor public class UserController {private final IUserService iUserService;GetMapping("/one")public Long one(){return iUserService.add();} }Long add();Se…

intel更新13代桌面处理器产品线,更多核心更贵价格

intel 13代酷睿产品线更新带来了更多低于125w TDP的处理器。intel确认了10个65wTDP的SKU和6个35wTDP的SKU。13代酷睿包含新的Raptor Lake和旧的Alder Lake(Refresh)处理器。因为桌面处理器型号序列比较乱&#xff0c;这是SKU命名方式的列表&#xff1a;1XX00KS – 特别(灰烬)版…

【回答问题】ChatGPT上线了!给我推荐比较流行的音频处理算法模型

给我推荐比较流行的音频处理算法模型 音频处理算法模型有很多种&#xff0c;我给你列举一些比较流行的&#xff1a; 声音分类&#xff1a;用于将声音信号分成不同的类别&#xff0c;比如人声、自然声、机器声等。 声音分离&#xff1a;用于从混合的声音信号中分离出单独的声…

PDF可以转Word吗?3种方法建议收藏

PDF文件是很常见的文件传输格式&#xff0c;大部分的时候我们会将常见的办公文件格式转换成PDF。PDF文件占存较小&#xff0c;传输的速度比较快&#xff0c;而且文件的固定性强&#xff0c;不会轻易发生改动让排版和文本错乱&#xff0c;是很好用的文件格式。但常常对于我们所需…