【Java8网络编程】第1章.基本概念

1.网络的基本概念

网络开发已经成为每个开发人员的核心技能。很多应用程序使用网络,如即时通讯软件(微信,QQ等),电子邮件,浏览器,远程控制等。

1.1网络

网络 是一系列设备(计算机,打印机,路由器…)的集合,这些设备被称为网络节点。节点之间可以通过电缆,无线电波,光纤交流。

每个网络节点都有唯一标识,被称为 地址(Address)

计算机之间来回传输数据需要协议(protocol),以保证计算机能够找到另一台计算机,并且保证它们之间能够互相理解。


1.2 网络分层

ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的 TCP/IP协议栈 获得了更为广泛的应用。

TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。

主机到网络层:  

实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。  

网络互连层: 

网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。   

传输层:  

在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层主要定义了两种服务质量不同的协议。即:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)。

【TCP协议】是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。  

【UDP协议】是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。  

应用层: 

应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(FTP)、虚拟终端协议(TELNET)、超文本链接协议(HTTP),也有基于UDP协议的。


1.3 IP地址,域名与端口

IP地址:

用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是一串很长的数字,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。

域名:

IP地址是Internet主机的作为路由寻址用的数字型标识,人不容易记忆。因而产生了域名(domain name)这一种字符型标识。当访问一个域名时,DNS服务器会把域名转化为相应的IP地址再进行访问

端口:

在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。

如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。


2.Java中的网络编程基础

2.1 java.net.InetAddress类

InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。

InetAddress对域名进行解析是使用本地机器配置或者网络命名服务,如域名系统(DNS)等实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

对象的建立

InetAddress的构造函数是私有的,所以需要通过它提供的静态方法来获取,主要有以下的方法:

static InetAddress[] getAllByName(String host)

static InetAddress getByAddress(byte[] addr)

static InetAddress getByAddress(String host,byte[] addr)

static InetAddress getByName(String host)

static InetAddress getLocalHost()

//getByName(String host)方法。InetAddress会尝试做连接DNS服务器,并且获取IP地址的操作。
InetAddress address = InetAddress.getByName("wwww.baidu.com");

//getAllByName()方法是根据主机名返回其可能的所有InetAddress对象,保存在一个数组中。
InetAddress[] addressArray=InetAddress.getAllByName("wwww.taobao.com");

//getLocalHost(),返回的是本地地址
InetAddress address_local=InetAddress.getLocalHost();

上面代码使用 System.out.println() 输出,结果如下

wwww.baidu.com/111.13.101.208

[wwww.taobao.com/140.205.230.49]

Jiazhi-PC/192.168.0.101

对象方法

InetAddress address=InetAddress.getByName("www.baidu.com");
//getAddress()方法获取地址数组
System.out.println(Arrays.toString(address.getAddress()));
//获取主机ip地址
System.out.println(address.getHostAddress());
//获取域名
System.out.println(address.getHostName());

输出如下:

[-76, 97, 33, 108]

180.97.33.108

www.baidu.com

注意:getAddress()这个方法返回的byte数组是有符号的。在Java中byte类型的取值范围是-128?127。如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数。需要加256即可,在上面中-76+256=180正好。


2.2 java.net.NetworkInterface类

NetworkInterface定义了很多获取网络接口信息的方法,其中很多是jdk1.6版本以后才加入进去的。主要有以下方法:

String displayName() 获取网络接口的显示名称

byte[] getHardwareAddress() 获取网络接口的物理地址,通常是MAC地址

int getMTU()返回此接口的最大传输单元(Maximum Transmission Unit,MTU)

String getName()获取此网络接口的名称

boolean isLoopback()返回网络接口是否是回送接口

boolean isPointToPoint()返回网络接口是否是点对点接口

boolean isUp()返回网络接口是否已经开启并运行

boolean isVirtual()返回此接口是否是虚拟接口(也称为子接口)。

实例:

// 获取本机所有网卡信息
Enumeration<NetworkInterface> enums = NetworkInterface.getNetworkInterfaces();
while (enums.hasMoreElements()) {
    System.out.println(enums.nextElement());
}
时间: 2024-10-19 01:46:30

【Java8网络编程】第1章.基本概念的相关文章

《Go语言网络编程》第一章:体系

原书地址:http://tumregels.github.io/Network-Programming-with-Go 如果不知道想要构建什么,是不可能创建一个系统的.而且如果不知道它工作的环境,也同样无法构建. GUI程序不同于批处理程序:游戏程序不同于商业程序:分布式程序不同于单机程序. 他们都有自己的方法.一般模式和问题,都有各自的常见问题和常见解决方案. 本章讨论分布式系统高层架构层面的一些内容.有多种方式看待这样的系统,而且其中的许多问题已经被解决. 协议层 分布式系统很难!其中涉及到

UNIX 网络编程第五章读后有感

刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: 1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <stdio.h> 4 #include <error.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <s

unix网络编程第四章----基于TCP套接字编程

为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int type,int protocol); family表示协议族,比如AF_INET,type表示套接字类型, protocol一般设置为0 family: AF_INET ipv4协议 type: SOCK_STREAM 字节流套接字 SOCK_DGRAM 数据报套接字 SOCK_RAW 原始套接字 pro

unix网络编程第2章

time_wait状态  可靠地实现tcp全双工连接的终止; (假设客户端先关闭).服务端再关闭,服务端将发送fin ,客户端此时进入time_wait状态.客户端接收到fin.将回一个ack.如果这个ack一旦丢失..time_wait这段时间,会使得服务端重新发送fin (2)使得老的重复分节在网络中消失,五元组相同 这个规则存在一个例外:如果到达的SYN的序列号大于前一化身的结束序列号,源自Berkeley的实现将给当前处于TIME_WAIT状态的连接启动新的化身(必须是服务端先关闭.因为

UNIX网络编程 第1章:简介和TCP/IP

1.1 按1.9节未尾的步骤找出你自己的网络拓扑的信息. 1.2 获取本书示例的源代码(见前言),编译并测试图1-5所示的TCP时间获取客户程序.运行这个程序若干次,每次以不同IP地址作为命令行参数. 1.3 把图1-5中的socket的第一参数改为9999.编译并运行这个程序.结果如何?找出对应于所输出出错的errno值.你如何可以找到关于这个错误的更多信息? socket error: Address family not supported by protocol 1.4 修改图1-5中的

UNIX网络编程第4章4.5listen函数4.6accept函数

#include <time.h> #include "../lib/unpsunyj.h" // Daytime server that prints client IP address and port int main(int argc, char **argv) { int listenfd; int connfd; socklen_t len; struct sockaddr_in servaddr; struct sockaddr_in cliaddr; //

UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数

1: #include <iostream> 2: #include "../lib/unpsunyj.h" 3: 4: int main(int argc, char **argv) 5: { 6: union { 7: short s; 8: char c[sizeof(short)]; 9: } un; 10:   11: un.s = 0x0103; 12: std::cout << "un.s =: " << un.s

UNIX网络编程第30章客户服务器程序设计范式 草稿

第三章 网络编程

终于学到网络编程了! 先上图和程序: 这是今天写的TCP的实现 服务器和客户端分别在两台电脑 这是服务器图: 这是服务器程序: 1 #-*- coding:utf-8 -*- 2 from socket import * #导入socket所有属性 3 from time import ctime #导入ctime() 4 5 6 host = '' #HOST 变量为空,表示bind()函数可以绑定在所有有效的地址上. 7 port = 21000 #设置端口 8 bufsize = 1024