java网络编程_【Java视频教程】day37-??网络编程??

34fa0b8b74f076418637ff8d7af8c589.png

网络编程概述

网络编程介绍

原来,我们写的程序,都是直接将数据保存在本机上,要么是内存中,要么是硬盘上;

如果要将数据传输到其他人电脑上,就需要使用网络;

那什么是网络呢?

6a03a86450a9a9994488f80efd4c1006.png

65633c67b3627574ae033080cd4dc303.png

520afc18dabadcf6ba9a91a345fbcb3c.png

6ad0765ab950db80fa6f2996a3fa1e94.png

网络的概念:

通过各种中间设备(例如网线、交换机、路由器、光纤、卫星、信号塔等等)将不同的通信终端(电脑、手机、ATM机、监控摄像头等等)连接起来,就形成了网络;

网络编程 :

就是编写一种程序,可以通过计算机网络和其它计算机上的程序进行数据交换。

在这个过程中,我们要学习研究的还是编程,不是网络;

CS和BS架构介绍

软件架构:

CS:Client/Server 客户端/服务端

开发软件的时候,程序员需要开发2套软件,一个是给用户使用的客户端程序,一个是给服务器运行服务端程序。开发周期长,开发的成本高,服务器中的服务软件升级,导致客户端程序也随着升级。

好处:可以把一些运算放在客户端的电脑上运行。降低服务器的压力。

BS:Browser / Server 浏览器/ 服务端

浏览器不需要用户安装。操作系统自带浏览器。程序员在开发的时候,只需要开发服务端的程序即可。

降低的开发的成本,以及后期维护的成本。

弊端:把以前可以在客户端运行的计算,全部转嫁到服务端。

网络模型(了解)

要学习网络编程,我们就要先了解一下网络模型;

什么是网络模型呢?

我们知道,在现实生活中的网络中,有各种不同的设备和程序在运行;

这些设备是不同厂家生产的,这些程序也是不同的公司编写的;

他们之间要能正常通信,必须要遵守某种约定;

所以人们将网络中的东西按照功能进行划分,并且制定好不同功能之间通信的标准,就形成了网络模型;

网络模型一般有两种:OSI(Open System Interconnection开放系统互连)参考模型 和TCP/IP模型;他们的对应关系如下:

64c7c9bf549241251cf94043924d5093.png

网络模型7层概述:

  1. 应用层: 主要是各种具体的应用软件;

例如,要给其他人发送图片,需要找一个软件,比如QQ、飞秋、浏览器等,这些就属于应用层的东西;

  1. 表示层: 连接应用层和会话层,主要实现数据的转换处理,如加密解密、压缩解压缩、编码解码等;

例如,要发送的图片,是人能够直接识别的数据,但计算机不能直接识别;要使用计算机将图片发送出去,必须先将图片转换为计算机能够识别的数据;

  1. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
  2. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
  3. 网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。
  4. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
  5. 物理层: 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

c56ed8585d413a0d92e9ee15866f7723.png
2971e4b40f45892e9ce91846b73048af.png
https://www.zhihu.com/video/1079284255670173696

网络编程的三要素

IP介绍

IP:

IP地址,就是计算机在网络中的唯一标识;

在网络中,一台计算机要和其它计算机区分开,需要有个唯一标识;因为计算机是通过网卡接入网络的,所以这个唯一标识是计算机的网卡地址;

网卡是一个硬件,每个网卡在生产时就固定了一个全球唯一的地址;

ef0c97c2b0ad4ea575713404318f27b5.png

因为这个地址很不方便记忆,所以网络为每个接入的网卡又分配了一个唯一标识,就是IP地址;

ff5f4bfb435afb5c9c30b92072db29e5.png

IP地址一般在机器接入网络时由路由器分配,是一个逻辑地址;

IP有两种版本:

IPv4:使用32位数字表示,总共2 ^32个,共有42亿多将近43亿个IP资源。肯定不够用。

IPv6:使用128位数字表示,总共2^128个,大约3.4×10^38个IP资源,近乎无限的。

有几个特殊IP:

127.0.0.1 是本地回环地址,表示本机(localhost)

x.x.x.255 广播地址

例如,发送信息到192.168.1.26,就只能发给这个人,其他人收不到;

发送信息到192.168.1.255,就可以发给1号段的所有电脑,只要在这个局域网中;

x.x.x.1网关(连接不同网络的地址)

域名解析

由于IP地址也不容易记忆,因此又给每个ip绑定了一个名称。这个名称被称为(域名)。

我们上网时在浏览器地址里面输入的就是网址,例如:

传智播客:www.itcast.cn

快学大数据:www.kuaixueit.com

百度:www.baidu.com

那么问题来了:为啥我用域名能找到对应的计算机服务器呢?

实际上,每个合法的域名,都会对应一个IP地址;

通过域名找到对应的计算机的方法:

1)本地域名解析

在我们电脑中有一个文件:C:WindowsSystem32Driversetc文件夹下有一个文件:hosts

这个文件中定义的是:域名和IP的对应关系。

5d72fe21c726b3e418ea42341b94cd23.png

69e1f6436e62fac74aa6625b1584445f.png

当我们向浏览器中输入一个域名,按回车键,浏览器就会去找这个文件,看看我们的文件中有没有这个域名对应的ip

如果没有,就去DNS服务器找解析;

  1. DNS服务器解析

DNS服务器也网络中的一些计算机,里面保存了网址和IP的对应信息;

e1ba937ebfc08e5ec0056fb880a16699.png

全世界所有网站,只要是合法注册了的,在注册的时候,都会把自己的网址和IP提交到DNS服务器里面;

5321f986e536e7c2f2e36bd3742779a8.png
07c18b4dec0e4d1333d02b2ffacae882.png
https://www.zhihu.com/video/1079284604132847616

端口

我们可以通过IP找到网络中的某台计算机。但是计算机中可能同时运行了很多个程序,例如迅雷、QQ等;如何确定数据应该发送给我们想要的程序呢?

这个时候就要用端口了。

端口号,就是正在运行的网络程序在计算机中的标识;

端口号的特点:

A:端口号是0到65535的数字;其中,0到1024是系统使用或保留的端口,我们不要使用;

B:计算机中每一个网络进程都至少要占用一个端口号;

C:同一个端口号只能被一个进程使用,不能同时被多个进程使用;

D:端口号只是在程序运行时被使用,程序一旦结束,端口号就会作为系统资源被释放;

通过使用360等软件可以查看所有被使用的端口号;

5b93608d30257a0f5ea7ee64bdbfb476.png

在命令行窗口中可以使用命令行 netstat -ano 查看本机所有正在使用的端口:

f1077aabb3c8e74148e4ff83c6bf08a7.png

再使用命令 tasklist|findstr pid 可以根据占用端口的程序的pid找到对应的程序:

f905830b2baa8ce7e45252006054b32b.png

dd941609d272480e231890ebae7cc800.png

常用端口:

mysql:3306

服务器:80 8080

协议

协议:就是计算机通信的规则

fedbac62e7317f3149e381974bc39b3c.png

UDP(User Datagram Protocol,用户数据报协议)的特点:

A:面向无连接,发送一方不用关心接收一方是否在线,就直接发送数据;如果对方在就可以接收数据,如果不在,就丢弃数据;

B:封装数据包

C:限制大小

D:不可靠

E:速度快

举例:类似发短信;

TCP(Transmission Control Protocol 传输控制协议)的特点:

A:不限制大小

B:需要通过三次握手建立连接

C:可靠

D:速度慢,效率低

6718245c184c9a55f3c3d7feefa1ca90.png

相当于打电话;

例如:

飞秋既可以聊天,也可以传文件;

聊天: 要求速度非常快,可靠性不是非常高,一般就是用UDP协议;

传文件: 这个要求可靠性非常高,数据大小也不应该有限制,所以一般都使用TCP协议;

地址和套接字

那我们正式来演示一下使用java代码实现网络编程;

要进行网络通信,需要知道其它计算机的IP地址,java中使用InetAddress类描述IP这个事物;

InetAddress类(IP对象)

7da28502b6fd4fbdb7dc05a87b802eea.png

a29d9bc02fce085e041cfdfd2a19f49a.png

e529179ec603f0219e76b1e12280010e.png

e002b8163d6c5dd6e0ced1d7f52e850d.png

20dd61d917c7a74b23ecc70bfa07f48b.png

52f185ad58610a1b809a75a72116c2be.png
ff38d1e3772527a37b6a36998d67e50a.png
https://www.zhihu.com/video/1079284838154113024

Socket介绍

a9e2149f63397ba85db7703fbaaa60ff.png

f7949014db040ef58b0273d6c96fd7df.png

UDP传输

UDP中两个重要的类

使用UDP协议和其他机器进行通信,就像现实中发快递一样;

在使用这种协议发送数据时,首先需要一个数据报包对象,将我们要发送的数据装起来,然后同时在数据报包对象中传递目标ip和端口;

然后,使用socket对象将数据报包对象发出去(相当于发快递时包裹打好后,就需要通过快递公司发出去);

DatagramPacket:

74ba6e40593c8b0a014ed027898a4d07.png

fbc8a988d07068bade7d0849dbdac389.png

1bf77b1642753229af66bbde423b371f.png

da8fa91d85c262262b9717a24d673f6f.png

DatagramSocket:

282223bd21f7f06078ac2d3c09c71dab.png

b7fd1684409894ac716488d87034a6dc.png

发送方发送数据报包的方法:

87299df45e6a4652d5a00486b481e5c4.png

下面这个是给接收方使用;

dd80f0d0b3e725dca5dc427b8a0e74f2.png

接收方接受数据报包的方法:

068a53ed89be74272ba1deaaa2786cfc.png

关闭socket,释放资源的方法

f2660f0a5ec9950f89b70b4f46f52c2f.png

UDP程序演示

发送数据:

步骤:

  1. 创建一个数据报包对象,将要发送的数据和目标ip、端口都封装起来;
  2. 创建一个数据报Socket对象,
  3. 调用上面创建的Socket对象的send方法,将这个数据报包发送出去
关闭套接字

如果发出去的数据报包没有人接收,不会报错,而是直接就会被丢弃

接收数据:

步骤:

  1. 创建一个数据报包对象,用于包装传过来的数据
  2. 定义一个Socket对象,监听指定端口,专门用来接受发送到这个端口的数据;

3、调用方法接收:程序执行到这一步的时候,会阻塞起来,一直到有数据发送过来,才会继续往下执行。

  1. 解析数据报包,取出各种数据
  2. 关闭socket对象,释放资源
public 

收到消息后给发送者一个反馈信息

接收端代码:

public class UDPReciveDemo2 {
 public static void main(String[] args) throws IOException {
		//1、创建一个空的数据报包对象,用来接受收到的数据
		DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
		//2、创建一个接收方的Socket对象,监听12345端口
		DatagramSocket ds = new DatagramSocket(12345);
		//3、调用接收方Socket的方法,接受数据
		ds.receive(dp);//程序启动后,会阻塞在这一步,知道有数据接受到,才会往下执行
		//4、解析收到的数据
		InetAddress address = dp.getAddress();//获取发送方的ip
 int port = dp.getPort();//获取发送方的端口
 byte[] byts = dp.getData();//获取接受的数据
 int length = dp.getLength();//获取发送的数据的长度
		System.out.println("我是接收方,我收到["+address.getHostAddress()+":"+port+"]发送的数据:"+new String(byts,0,length));
		//5、给发送方返回一个数据,告诉对方已经收到数据
		//创建一个数据报包对象,用来封装给发送方返回的数据,以及发送方的ip和端口
		byts = "来信已收到,谢谢!".getBytes();
		dp = new DatagramPacket(byts,byts.length,address,port);
		ds.send(dp);
		//6、关闭socket,释放资源
		ds.close();
	}
}

发送端代码:

public 

TCP编程

TCP的Socket介绍

在建立TCP连接时,需要一方先向另一方提出连接请求;首先发起请求的一方叫做客户端,接收客户端请求的一方叫做服务端;

因为TCP连接中存在两个不同的角色(客户端和服务端),而网络连接中都需要通过Socket进行,所以Java中使用了两个Socket类来实现TCP协议:

客户端socket;Socket;

服务端socket:ServerSocket;

Socket介绍

0b29ac81e7149fb73efe8df8077b2f77.png

e10c04e24814042d46968a86f4c5a9cb.png

46607f91432c6a42bd7a374f27af476c.png

6db87b74a0507691030cc4be8ad236ad.png

2e801196090150da0553cbfc08524c62.png

46876557aee67ecf1c8dea41fa573938.png

635c2241165ab5383130108d04a5e2d3.png

ServerSocket介绍

6ad19dce2307acfab67d24f455715561.png

1f874728cc1956eace03d4de532aeb42.png

1fdde6cfeaa79bffe0e9373ba9846cf7.png

07b056326c0bd2302aaba9721a3346e9.png
ea3a9fe4297a21343b8c459b7a68ee94.png
https://www.zhihu.com/video/1079285233572147200
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值