Java网络编程核心要点:网络模型解析、IP地址应用、TCP/UDP协议与Socket编程概述

更新:11-16 民间故事 我要投稿 纠错 投诉

画个图来表示通信过程:

02-网络编程(概述2)

IP地址分为四段。每个段实际上是一个字节。一个字节的最大值为255(8个1)。

有一个非常特殊的IP地址,它是127.0.0.1。这是本地环回地址。也就是说,如果本地没有分配IP地址,则本机默认的IP地址是127.0.0.1。

可以PING一下来测试网卡:

最后4段IP地址已经不够了(IPV4),所以出现了6段IP地址(IPV6)。 IPV6不仅包含数字,还包含字母。整理组合后,地址有很多,够用了。这就是我们的新网段地址(IPV6)和旧网段地址(IPV4)之间的差异。

下面我们来谈谈端口。端口号的选择范围是0-65535。通常0-1024范围内的端口被系统保留。

03-网络编程(网络模型)

讲完网络传输的三个基本要素:IP地址、端口、协议,我们再来说说具体的传输方式。

首先我们来谈谈网络模型。

在网络的传输过程中,由于每一层对应不同的功能,因此存在详细的层划分。

网络参考模型:

刚刚开始7层参考模型的数据分包过程:

数据解包过程:

后来开发了简化的参考模型,将应用层、表示层和会话层合并为应用层,将数据链路层和物理层合并为主机到网络层。传输层和网络层(互联网层)更为重要,因为仍然单独存在。简化的参考模型只有四层。

那么我们现在主要研究哪一层呢?

因为我们研究的是软件,所以我们不需要担心从主机到网络层的硬件部分。我们主要研究应用层、传输层、互联网层。传输层和互联网层是我们研究的重点。我们之前写的程序都是在这一层。

如果你学习Java Web开发,你将主要从事应用层工作。

那么,我们现在要玩的是软件的底层(传输层和互联网层),而应用层则是根据我们所学的,进行封装的。所以应用层就更简单了。

每层都有自己的协议(通信规则)。传输层最常见的协议是TCP和UDP,互联网层最常见的协议是IP,应用层最常见的协议是HTTP和FTP。

我们下一步的计划是先学习互联网层和传输层,掌握了它们的特点后再学习应用层。

04-网络编程(IP地址)

我们知道网络通信有三要素:IP地址、端口号、传输协议。那么如何用Java来操作呢?我们想到将其封装成对象。

我们先来看看这些元素的特点。

IP地址:

1、是网络中设备的标识。

2、不好记,可以使用主机名。

3.本地环回地址:127.0.0.1 主机名:localhost

主机名和IP地址是对应的,每台计算机都有自己的主机名:

那么IP到底代表什么呢?

让我们看一下java.net包。

net包中用来描述IP的对象是InetAddress,它有两个子类“4”和“6”:

打印本地主机名和地址:

还可以使用非静态方法分别获取主机名和地址:

有没有办法获取任何主机的主机名和地址?

我们想一想。如果该方法存在,则该方法的返回值类型是IP地址对象(即InetAddress)。另外,对于任何一个主机,为了明确自己是哪一个,必须指定并传入这个主机,所以这个方法也需要参数。分析完这两个要素后,我们寻找满足这两个要素的方法。

我们看到一个通过传入主机名返回IP 地址对象:

代码演示:

不过这里我们还是用自己的机器来测试,我们再试试其他机器:

运行速度非常慢:

如果该地址及其对应的主机名不在网络上,则搜索该地址将无法成功解析。那么为什么我们的本地机器可以解析这个而不能解析这个呢?因为在本机上有本机的信息,但没有查到另一台机器的信息,所以返回的主机名仍然是IP地址。

其实只要我们连上互联网,我们就可以直接获取百度的主机名和地址(不需要写它的IP地址,只写它的域名,与IP地址对应),但是百度针对这么一大群人,它肯定有多个主机,而一个地址可能对应多个服务器,所以返回的IP对象可能不唯一,所以这里还有一种方法,通过传入主机名返回一个数组:

05-网络编程(TCP和UDP)

端口号:

1、是用来标识进程以及不同进程的标识的逻辑地址。

2、有效端口:0~65535,其中0~1024为系统使用或保留的端口。

端口只是一个数字标识符,因此不需要封装成对象。

让我们重点关注传输协议。

传输协议:

1.这是沟通的规则。

2.常用协议:TCP、UDP。

TCP 和UDP 有什么区别?

UDP 是无连接的,将数据封装到数据包中,然后附加一个小注释,指示其地址和端口。一般来说,传输有两端:发送端和接收端。如果采用UDP传输,则对方在不在都没有关系。我只是发送我的并将数据打包并发送出去。如果你在那里,你就会收到它。如果没有,您将收到包裹。把它扔掉。另外,传输过程中可能会出现地址不存在的情况。

UDP的特点:

1. 将数据、源和目的地封装在数据包中,不建立连接。

2. 每个数据包的大小限制为64k。

3、因为没有连接,是一种不可靠的协议,容易丢包。

4.无需建立连接,速度快。

我们的聊天和视频共享都是UDP。存在与否并不重要,只要发送数据即可。

下面我们来谈谈TCP。 TCP 必须是面向连接的。也就是说,如果使用TCP进行通信,对方必须在场,但如果对方不在场,则不起作用。是比较靠谱的。如果单方面断开,数据将无法传输。必须形成路径才能传输数据。

那么如何确认对方是否在呢?

我们通过三次握手来做到这一点。

TCP的特点:

1、建立连接,形成传输数据的通道。

2、连接过程中传输大量数据。

3、连接是通过三次握手完成的,是一个可靠的协议。

4、必须建立连接,效率会稍低。

TCP相当于打电话。只有对方接听电话后,您才能通话。

06-网络编程(Socket)

接下来我们来谈谈Socket。我们所说的网络编程其实就是Socket编程。

Socket是一种为网络服务提供的机制。

通信的两端都有Socket,只有有了Socket才能建立连接。它相当于一个码头。有了码头,船舶就可以在两个码头之间通行并运送货物。

网络通信实际上就是Socket之间的通信。

两个Socket之间通过IO传输数据。

07-网络编程(Udp-Sender)

Socket是可以的,但是传输协议不同。每个传输协议都有自己的建立端点的方式。

我们先来说说UDP Socket服务的建立。

我们看到java.net包中有两个socket对象,一个叫DatagramSocket:

该对象既可以发送也可以接收。如果有两个端点发送和接收数据,那么这两个端点都必须有这个对象。

那么我们是否需要指定发送和接收哪些数据:

UDP需要将数据封装成一个数据包发送过来,包括扩展对方的地址和端口,以及自己的地址和端口,都在这个数据包中。这个数据包非常复杂,所以将这个数据包封装成一个对象。这个对象这是DatagramPacket:

接下来我们需要编写代码。我们的需求是:

代码:

不要忘记导入包:

由于它是无连接的,因此该数据会丢失。如何接收这些数据?

08-网络编程(UDP-接收端)

数据丢失的原因是接收端没有开机。本课我们将编写接收端代码。为了更直观,我们将接收端代码和发送端代码写在同一个java文件中,但它们是独立的两块。正在运行的程序,因此它有自己的主要功能。

接收端的需求和想法:

定义udpsocket服务时,通常会监听一个端口。事实上,您为接收网络应用程序定义了一个数字ID,这使得您可以更轻松地识别应用程序可以处理哪些数据。

代码:

接下来,要运行,请打开两个dos 命令行:

这里的1093是系统为发送方随机生成的数字ID(在我们不指定发送方数字ID的前提下):

运行几次后,发现每次都不一样:

如果我们为发件人指定数字标识符8888:

那么我们指定的数字ID就会显示在这里,而不是系统随机分配的:

09-网络编程(UDP-键盘录入方式数据)

在此处添加while(true) 循环:

这里添加while(true)循环的好处是接收端运行时运行一次就可以了。因为receive方法是阻塞方法,所以会一直等待。我们运行一次后,它会一直等待。每次发送数据都可以接收,实现重复接收:

但我们发现老师每次都发同样的一句话。我们可以寄其他东西吗?

那我们改一下这个,重新编译,运行,发送?

但一次只能发送一句话,每一句都得重新编译运行,非常麻烦。

那么我们可以通过键盘输入吗?

代码:

运行效果:

我们刚刚使用的地址是192.168.1.254。最后一段中的值0和255是特殊的。 192.168.1.0代表这个网段,192.168.1.255是这个网段的广播地址,是针对这个网段的。所有地址均被读取和发送。

您可以通过更改此地址来实现群聊:

10-网络编程(UDP-聊天)

我们刚才创建的效果是模拟聊天,但是是在两个窗口中实现的。可以在一个窗口中实现吗?

这时候就必须使用多线程技术。一个线程控制接收,另一个线程控制发送。

因为接收和发送动作不一致,所以必须定义两个run方法,并且这两个方法必须封装到不同的类中。

请注意,Send 方法应更改为public 而不是private。请注意,buf.length 后面没有;是的。请注意,Rece 方法应更改为公共而不是私有。记得导入这两个包:

运行效果:

但有一个问题。当我们正在写入数据,还没有按回车发送时,如果这时候发送一条消息,就会出现下面的问题,混在我们正在编辑的数据中:

这都是因为发送者和接收者混合在同一区域。如果我们制作一个图形界面,将发送方和接收方分成两个区域,这个问题就迎刃而解了。

11-网络编程(TCP传输)

说完UDP传输,我们再来说说TCP传输。

我真的很着急,这里只是截图,我好着急,好着急。

演示TCP传输:

12-网络编程(TCP传输2)

刚才客户端向服务器发送了消息,但服务器没有给客户端反馈。接下来,我们需要实施反馈行动。

需求描述及实现步骤:

代码:

运行结果:

13-网络编程(TCP练习)

接下来,我们将通过一个练习来使用开发中常用的对象。

需求描述:

代码:

运行后发现客户端发送了信息,但是服务器端却收不到。出了什么问题?

首先考虑客户端是否已经发出去了?

客户端的数据被写入缓冲区。这里突然想起来,刚才忘记写flush了,所以我们加上flush。

另一个问题是服务器读取数据并判断结束标记是换行标记:

客户端发送的数据后面没有换行符,所以我们添加一个换行符。修改后的代码如下:

运行时,服务器收到了客户端的数据,但是客户端没有收到服务器返回的大写数据。

我们忘记再次刷新服务器,因为它的数据也写入了缓冲区。另外,和服务端一样,客户端用来判断数据结束的标记也是换行符,所以我们也添加换行符,代码修改如下(与刚才添加的相同)客户端代码):

跑步:

本例中的问题:

另外,本例中还有一些代码可以简化。客户端和服务器的简化部分是相同的。这是服务器部分的示例:

14-网络编程(TCP复制文件)

刚才的例子是通过键盘输入方式从客户端向服务器端输入数据。我们再讲一个例子。客户端的数据发送到服务器,然后服务器将数据保存到文件中。这相当于数据复制。

过去,文件是从C 盘复制到D 盘。现在,文件是从我的机器复制到您的机器。里面加入了网络技术,但仍然是IO。

代码:

记得导入包:

但程序一直没有停止,也没有像我们预期的那样成功上传文本:

但我们到文件夹里再看了一下,发现文件已经成功保存了。

原来是因为代码中没有结束标签,所以在客户端代码中,当文件中的数据全部读取完毕后,我们添加结束标签“over”:

判断服务器端的结束标志“over”,如果遇到则结束:

但是,如果文件本身包含“over”并且与我们的结束标记“over”同名怎么办?

我们使用以下字符串怎么样:

但即使对于这一串字符,这个定义也很容易重复。我们使用一个唯一的标记:时间戳,因为每个时刻的时间都是唯一的。

注意,在客户端代码中,在发送数据之前,需要将时间戳发送给服务器,让其知道这是结束标记。然后客户端读取源文件的数据,然后添加时间戳作为结束标记。以下是客户端和服务端代码的修改,客户端:

服务器:

其实这还是一个比较麻烦的方法,我们只是想了解一下(好生气!)

其实还有更简单的方法,只需要修改客户端中的代码,添加如下代码即可:

好的:

day23的课程太仓促了,我也很着急,所以截图了很多,而且没有很仔细听,这让我感到羞愧。

这两天实在是太不舒服了。宿舍和实验室都空了。我一个人呆在实验室里学习。实际上很难集中注意力,因为这真的很不舒服。不过,一切都会过去的。加油小楠楠(;` )

用户评论

玩味

今天又学到关于网络编程了!

    有19位网友表示赞同!

你很爱吃凉皮

感觉网络编程好复杂,不过这个笔记看起来说得挺清楚的。

    有16位网友表示赞同!

予之欢颜

UDP是什么玩意啊?听起来好神秘的似的。

    有17位网友表示赞同!

呆檬

我印象中TCP是可靠的通信协议吧?

    有9位网友表示赞同!

长裙绿衣

Socket太重要了,学习了之后代码写的方便很多。

    有9位网友表示赞同!

命该如此

之前没接触过网络编程,这笔记让我开始了解一些基本概念。

    有6位网友表示赞同!

余笙南吟

IP地址这种东西一直都知道存在,但从来没好好看明白呢!

    有9位网友表示赞同!

滴在键盘上的泪

要学网路编程真的太棒了!感觉未来发展前景很广阔啊。

    有11位网友表示赞同!

迷路的男人

老师讲解的网络模型挺清晰的,有点像一层层递进一样。

    有20位网友表示赞同!

恰十年

TCP和UDP哪个协议更实用呢?哪个更有优势。

    有20位网友表示赞同!

凉城°

这个笔记能帮我快速入門網路编程吗?

    有7位网友表示赞同!

几妆痕

感觉学习Java很不错,学到很多实用性强的知识。

    有8位网友表示赞同!

凉月流沐@

网络编程太牛了,可以做各种各样的应用!

    有19位网友表示赞同!

淡淡の清香

我之前看过一些关于网络安全方面的文章,好像和网络编程有很大关系吧?

    有18位网友表示赞同!

◆乱世梦红颜

UDP的特性是什么啊?有什么具体的优势吗?

    有15位网友表示赞同!

一笑傾城゛

学习Java真是一趟让人感到快乐的旅程!

    有10位网友表示赞同!

泪湿青衫

这次笔记要重点复习一下TCP和UDP的区别了。

    有8位网友表示赞同!

容纳我ii

希望以后能够自己写出一些网络程序,感觉太酷了!

    有8位网友表示赞同!

ヅ她的身影若隐若现

这个笔记帮助我理解了网络编程的基础概念,期待更進一步的学习!

    有9位网友表示赞同!

【Java网络编程核心要点:网络模型解析、IP地址应用、TCP/UDP协议与Socket编程概述】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:探索靠谱购物渠道:10大平台精选,网上轻松购得正品莆田鞋 下一篇:《千古玦尘》角色概述:探寻上古传奇风采