java网络编程学习(一)
来源:互联网 发布:天猫淘宝京东的区别ppt 编辑:程序博客网 时间:2024/06/05 03:03
一 网络的分层
网络有两个分层方案,一种是传统的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协议,决定通过不同代理连接不同的主机。
- Java 学习--网络编程(一)
- java网络编程学习(一)
- Java网络编程学习笔记(一)基本网络概念
- Java网络通信学习(一)- Java Socket 编程
- Java网络编程 入门学习笔记(一)
- android学习笔记之网络编程一(java.net.*)
- Java 网络编程 学习笔记一 基础知识
- java网络编程Socket学习(一)
- java网络编程Socket学习(一)
- java网络编程(一)
- Java网络编程(一)
- Java网络编程(一)
- java网络编程(一)
- Java网络编程(一)
- Java 网络编程(一)
- Java网络编程(一)
- java网络编程(一)
- Java 网络编程(一) 网络基础知识
- 在datagrid中的toolbar添加输入框
- 简单线性表的java实现
- s5pv210——I2C通信代码分析(待写)
- edge detection
- 国际化
- java网络编程学习(一)
- javascript将url中的参数加密解密功能
- Cloud Native
- java中遍历map的四种方法
- 二叉树最小深度
- JAVA 网络编程中,输出io方法——printWriter中write()和println()区别
- 关于 WinXP SP2 下的 MIDI 漏洞利用
- A10负载均衡设备基础配置
- 常见损失函数