OSI 和 TCP/IP模型对比
TCP协议和UDP协议关系比较
TCP协议和UDP协议是传输层的两种协议。Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程两类。
在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。
这两种传输方式都在实际的网络编程中使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则可以通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据传递。
由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。
总结
TCP是面向连接的,传输数据安全,稳定,效率相对较低。
UDP是面向无连接的,传输数据不安全,效率较高。
TCP协议
TCP(Transfer Control Protocol)是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通讯协议。
特点:面向连接、点到点的通信、高可靠性、占用系统资源多,效率低。
所谓面向连接,就是当计算机双方通信时必需经过先建立连接,然后传送数据,最后拆除连接三个过程。
TCP在建立连接时又分三步走:
第一步,是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号。
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。然后才开始通信的第二步:数据处理。
这就是所说的TCP的三次握手(Three-way Handshake)。
UDP协议
UDP(User Datagram Protocol)一种无连接的传输层通信协议,提供面向事务的简单不可靠信息传送服务。
UDP协议,称为数据报通信方式。在这种方式中,每个数据发送单元被统一封装成数据报包的方式,发送方将数据报包发送到网络中,数据报包在网络中去寻找它的目的地。
特点:非面向连接,传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
可以广播发送
非常简单的协议,开销小
Java网络编程常用类
类 InetAddress
此类表示互联网协议 (IP) 地址。
Java中的InetAddress是一个代表IP地址的封装。IP地址可以由字节数组和字符串来分别表示,InetAddress将IP地址以对象的形式进行封装,可以更方便的操作和获取其属性。InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取。
IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。IP 地址的体系结构是由 RFC 790:Assigned Numbers、 RFC 1918:Address Allocation for Private Internets、RFC 2365:Administratively Scoped IP Multicast 和 RFC 2373:IP Version 6 Addressing Architecture 定义的。InetAddress 的实例包含 IP 地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。
类 InetAddress常用方法
查看下面代码关于InetAddress创建对象的用法
package com.NetworkCommunication;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestIntaddress {
public static void main(String[] args) throws UnknownHostException {
//使用getLocalHost方法创建InetAddress对象
InetAddress addr = InetAddress.getLocalHost();
System.out.println(addr.getHostAddress());//返回本机IP地址
System.out.println(addr.getHostName());//返回本机名称
//根据域名得到InetAddress对象
addr = InetAddress.getByName("www.baidu.com");
System.out.println(addr.getHostAddress());//返回www.baidu.com的ip地址:39.156.66.18
System.out.println(addr.getHostName());//返回www.baidu.com的名称www.baidu.com
//根据IP得到InetAddress对象
addr = InetAddress.getByName("39.156.66.18");
System.out.println(addr.getHostAddress());//返回baidu的ip地址39.156.66.18
System.out.println(addr.getHostName());
//输出的是IP而不是域名,原因:如果ip地址不存在或者DNS服务器不允许进行ip地址和域名的映射
//getHostName()就直接返回这个IP地址
}
}
类 InetSocketAddress
包含IP和端口信息,常用于Socket通信。此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。
构造方法与常用方法
查看下面关于InetSocketAddress的常用方法
package com.NetworkCommunication;
import java.net.InetSocketAddress;
public class TestInetSocketAddress {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress1 = new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost",8086);
System.out.println(inetSocketAddress1.getAddress());//获取InetAddress
System.out.println(inetSocketAddress1.getHostName());//获取hostname
System.out.println(inetSocketAddress1.getPort());//获取端口号
System.out.println(inetSocketAddress2.getAddress());
System.out.println(inetSocketAddress2.getHostName());
System.out.println(inetSocketAddress2.getPort());
}
}
URL类
IP地址唯一标识了Internet上的计算机,而URL则标识了这些计算机上的资源。类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
为了方便程序员编程,JDK中提供了URL类,该类的全名是java.net.URL,有了这样一个类,就可以使用它的各种方法来对URL对象进行分割、合并等处理。
URL的常用构造方法
URL常用的方法
查看下面代码:
package com.NetworkCommunication;
import java.net.MalformedURLException;
import java.net.URL;
public class TestURL {
public static void main(String[] args) throws MalformedURLException {
URL u = new URL("http://www.google.cn:80/webhp#aa?canhu=33");
System.out.println("获取与此url关联的协议的默认端口:" + u.getDefaultPort());
System.out.println("getFile:" + u.getFile()); // 端口号后面的内容
System.out.println("主机名:" + u.getHost()); // www.google.cn
System.out.println("路径:" + u.getPath()); // 端口号后,参数前的内容
// 如果www.google.cn:80则返回80.否则返回-1
System.out.println("端口:" + u.getPort());
System.out.println("协议:" + u.getProtocol());
System.out.println("参数部分:" + u.getQuery());
System.out.println("锚点:" + u.getRef());
URL u1 = new URL("http://www.abc.com/aa/");
URL u2 = new URL(u, "2.html"); // 相对路径构建url对象
System.out.println(u2.toString()); // http://www.abc.com/aa/2.html
}
}
//程序的执行结果:
获取与此url关联的协议的默认端口:80
getFile:/webhp
主机名:www.google.cn
路径:/webhp
端口:80
协议:http
参数部分:null
锚点:aa?canhu=33
http://www.google.cn:80/2.html