java网络编程学习(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yy_james/article/details/72358571

一 网络的分层

网络有两个分层方案,一种是传统的5层结构,另一种是ISO的7层结构

1 5层网络

(1)物理层

(2)数据链路层(PPP,Wifi,Ethernet)

(3)网络层(IP,ARP)

(4)传输层(TCP,UDP,ICMP)

(5)应用层(HTTP,FTP,SMTP,Ping,DNS)

2 7层网络

(1)物理层

(2)数据链路层(PPP,Wifi,Ethernet)

(3)网络层数据的表示、安全、压缩。(IP,ARP)

(4)传输层(TCP,UDP,ICMP)

(5)会话层(建立、管理、终止会话,在五层模型里面已经合并到了应用层)

(6)表示层(数据的表示、安全、压缩,在五层模型里面已经合并到了应用层。格式有,JPEG、ASCll、DECOIC、加密格式等。)

(7)应用层(HTTP,FTP,SMTP,Ping,DNS)


二 IPv4和IPv6

1 IPv4是使用4个字节数字表示的网络地址。一般写为点分四段的格式。

由于IPv4使用4个字节表示,因此,写成bit的形式是32个bit位。目前地址可以分为A、B、C、D、E五类地址。

A类地址:bit表示:0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子网掩码:255.0.0.0

B类地址:bit表示:10XXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子网掩码:255.255.0.0

C类地址:bit表示:110XXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,子网掩码:255.255.255.0

D类地址:bit表示:1110XXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,不区分网络地址和主机地址,用于组播

E类地址:bit表示:11110XXX.XXXXXXXX.XXXXXXXX.XXXXXXXX,不区分网络地址和主机地址,用于实验和测试


三 常用默认端口分配

echo:7

FTP数据传输:20

FTP指令传输:21

SSH:22

Telnet:23

SMTP:25

HTTP:80


四 Java中对应的IP地址类

Java中的java.net.InetAddress类是IP地址的抽象表示,Java中其他网络类都要使用这个类。

1 创建方法

(1)InetAddress address = InetAddress.getByName("www.baidu.com");

创建一个InetAddress对象,并建立与本地DNS服务器的连接来查找域名对应的IP地址,如果找不到对应的IP地址,则抛出UnknownHostException异常。

(2)InetAddress address = InetAddress.getByName("208.201.239.100");

System.out.print(address.getHostName());

使用字符串形式的IP地址创建一个InetAddress对象。在执行第一句的时候,并不会与本地DNS建立连接查询域名,在执行到第二句时才会查询。如果查询到域名,则第二句打印出域名,否则,打印出IP地址(不会抛出异常)。

(3)有时候一个域名会对应多个地址,如果需要得到所有地址,则

InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");

这个方法同样会抛出UnknownHostException。

(4)InetAddress address =  InetAddress.getLocalHost();

该方法尝试连接DNS获取本地主机的域名和IP地址,当获取失败后,该地址返回回送地址(localhost/127.0.0.1)。

(5)InetAddress address = InetAddress.getByAddresss(byte[] addr)

          InetAddress address = InetAddress.getByAddresss(String hostname,byte[] addr)

以上两个方法的addr参数要求传入一个字节数组(表示IP地址),由于Java中没有无符号字节,所以在传入大于127的数字时,需要将其强制转换为byte。

这两个方法不会尝试连接DNS服务器,只有在参数的格式出现异常时,才会抛出unknowHostExcepiton。


2 安全性问题

有些网络中不允许本地主机查询外部DNS服务器,认为这是一种不安全的操作。因此获取InetAddress对象前,可以使用一下方法测试存储目标地址的DNS是否可达。

SecurityManager.checkConnect(String hostname, int port);


3 InetAddress查询方法

public String getHostname(); //获取主机名,如果本地有缓存就直接使用,否则查询DNS

public String getCanonicalHostName();//获取主机名,每次都查DNS

pulbic byte[] getAddress();//获取主机IP地址

public String getHostAddress();//获取主机IP地址


4 测试可达性(由于路由器、代理服务器、防火墙等因素,导致本地主机与目标主机之间无法建立网络连接)

public boolean isReachable(int timeout) throws IOException

pulbic boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException


5 Object方法

(1)public boolean equals(Object o)

如果两个InetAddress对象具有相同的IP地址,则两个对象相等(不考虑主机名是否相等)。

(2)public int hashCode()

与equals()方法相同,该方法根据主机的IP地址生成hash值。

(3)public String toString()

返回格式为:主机名/点分四段地址


五 URL和URI

1 区别

URI称为统一资源标识符,可以使用网络位置标识资源,也可以由资源的名字、编号或者其他特性来标识资源。(侧重对资源的标识)

URL是一种最常见的URI,它可以唯一的标识资源在Internet上的位置,是对网络资源定位和获取的最简单的方法。(侧重对资源网络位置的定位和获取)


2 URL语法

protocal://userinfo@host:port/path?query#fragmet

protocal标识协议,如Http,Https,Ftp

query表示查询,常用的地方在表单提交

fragment表示片段定位,如Html中的锚和XML中的XPointer。


3 创建URL对象

(1)使用字符串构造URL

URL u = new URL("http://www.audubon.org/");

该方法尝试使用参数中的字符串构造一个URL,如果由于某些原因(协议不支持,或格式错误)无法构造,则抛出MalformedURLException

(2)通过指定协议、主机名、文件名构造URL

URL u = new URL("http","www.eff.org","/blueribbon.html#intro");

该方法使用协议参数对应的默认端口连接资源,构造失败时也会抛出MalformedURLException。此处应该注意的是,最后一个参数应该以“/”开头,表示文件路径。

当然也可以手动指定端口号

URL u = new URL("http","www.eff.org",8080,"/blueribbon.html#intro");


4 从URL中获取数据

(1)InputStream in = url.openStream();

该方法在服务器和客户端之间完成必要的握手,并返回一个InputStream。该方法将目标资源当做文本来处理,得到原始的内容。

这种方法的问题是,它无法确定目标资源的种类,将目标资源当做文本处理;此外它读取不到Http首部或者与协议相关的其他信息,因此无法确定目标文件的编码格式。


(2)URLConnection uc = url.openConnection();

  InputStream in = uc.getInputStream();

这种方式可以访问服务器发出的所有数据,除了原始的文档本身外,还可以访问这个协议指定的所有元数据;此外,这种方法还指出向服务器写数据,例如发送邮件、提交表单等。


该方法还提供了一个重载版本,可以指定通过哪个代理服务器传递连接。

public URLConnection openConnection(Proxy proxy) throws IOException;


(3)Object o = url.getContent();

这种方法获取由URL引用的数据,尝试由它建立某种类型的对象。

例如,如果URL指向某种文本,则返回InputStream,如果指向图像,则返回ImageProducer。


(4)URL u  = new URL("http://www.nwu.org");

           Class<?> types = new Class[3];

           types[0] = String.class;

           types[1] = Reader.class;

           types[2] = InputStream.class;

           Object o = u.getContent(types);

这种方式相当于定义了一种优先级,getContent()方法首先尝试使用String.class返回,如果不可以,则选择Reader.class返回,以此类推。

方法(3)(4)返回Object对象之后,都应该使用instanceof来检查返回对象的类型。


if(o instanceof String){}

else if(o instanceof Reader){}

else if(o instanceof InputStream){}

else{}


5 获取Url的其他属性

public String getProtocal() //获取协议类型

public String getHost() //返回主机名

public int getPort() //返回指定的端口号,如果没有指定端口号,则返回-1

public int getDefaultPort() //如果URL中没有指定端口,则该函数返回协议对应的默认端口,如果没有为这个协议定义默认端口,则返回-1

public String getFIle() //返回URL的文件路径

public String getPath() //返回URL文件路径(与getFile()不同,它的返回值不包含查询字符串)

public String getRef() //返回URL的片段标识部分(#),没有片段标识部分返回null

public String getQuery() //返回URL查询部分

public String getUserInfo //返回URL中的用户名、口令信息

public String getAuthority() //返回授权机构


6 相等性和比较

(1)URL类的equals()方法和hashCode()方法,要求两个URL对象有相同的主机、端口、路径资源、片段标识符和查询字段时,才相等。(equals()方法尝试查询DNS服务器来判断两个主机是否相等,所以,equals()方法可能被阻塞).


(2)URL没有实现Comparable接口。


(3)URL有一个sameFile(URL u)方法,基本上与equals()方法相同,但是它不考虑片段标识符。


7 URLEncoder和URLDecoder

发明Web时Unicode还没有普及,所以URL中使用的字符必须来自ASCII的一个固定子集,包括大小写字符、数据、一部分标点符号。

URL中除了上述字符外的其他字符,需要进行URL编码。

String encoded = URLEncoder.encode("THis Strng has space", "UTF-8"); //将字符串进行URL编码

Strign decoded = URLDecoder.decode("This%20String%20has%20space", "UTF-8"); //将字符串进行URL解码


六 代理

许多系统通过代理服务器访问Internet上的资源。代理服务器可以提高内网主机访问外网的安全性和性能。

基于URL类的Java程序可以使用大多数常见的代理服务器和协议。

(1)设置代理的方式:启动程序时使用-D选项,如 java -Dhttp.proxyHost=192.168.254.254 -Dhttp.proxyPort=9000

或者在代码中设置,如

System.setProperty("http.proxyHost", "192.168.254.254");

System.setProperty("http.proxyPort", "9000");

如果希望一台主机不被代理,则设置http.nonProxyHosts属性,使用“|”将多台主机隔开。也可以使用通配符,设置某个域内的所有主机都不使用代理。


(2)上面设置代理的方式是全局的代理设置,Proxy类可以实现Java对代理服务更加细粒度的控制,允许为不同的远程主机选择不同的代理。

Proxy类有三种代理:

Proxy.Type.DIRECT

Proxy.Type.HTTP

Proxy.Type.SOCKS


创建一个代理服务器


SocketAddress address = new InetSocketAddress("proxy,example.com", 80);

Proxy proxy = new Proxy(Proxy.Type.HTTP, address);


使用代理服务器:

URL u = new URL("http://www.baidu.com");

URLConnection con = new URLConnection(proxy);


(3)使用ProxySelector类,根据系统属性和URL协议,决定通过不同代理连接不同的主机。

展开阅读全文

没有更多推荐了,返回首页