解决了文章最开始提到的定位的问题。java
IP在互联网中能惟一标识一台计算机,是每一台计算机的惟一标识(身份证);网络编程是和远程计算机的通讯,因此必须先能定位到远程计算机;IP帮助解决此问题;一台计算机中可能有不少进程,具体和哪个进程进行通讯,这就得靠端口来识别;编程
IP和端口能惟必定位到须要通讯的进程。这里的IP表示地址,区别于IP协议。在OSI体系仍是TCP/IP体系中,IP协议位于网际层,来封装IP地址到报文中。 数组
TCP是Tranfer Control Protocol的简称,是一种面向链接的保证可靠传输的协议。经过TCP协议传输,获得的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须创建链接,以便在TCP协议的基础上进行通讯,当一个socket(一般都是server socket)等待创建链接时,另外一个socket能够要求进行链接,一旦这两个socket链接起来,它们就能够进行双向数据传输,双方均可以进行发送或接收操做。网络
UDP是User Datagram Protocol的简称,是一种无链接的协议,每一个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,所以可否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。app
比较:socket
UDP:编码
TCP:url
数据桢:spa
应用:.net
Socket是网络驱动层提供给应用程序编程接口和一种机制。咱们能够把 Socket 比喻成是一个港口码头。应用程序只要把货物放到港口码头上,就算完成了货物的运送。对于接收方应用程序也要建立一个港口码头,只须要等待货物到达码头后将货物取走。
Socket 是在应用程序中建立的,它是经过一种绑定机制与驱动程序创建关系,告诉本身所对应的 IP 和 Port。在网络上传输的每个数据帧,必须包含发送者的 IP 地址和端口号。建立完 Socket 之后,应用程序写入到 Socket 的数据,由 Socket 交给驱动程序向网络上发送数据,计算机从网络上收到与某个 Socket 绑定的 IP 和 Port 相关的数据后,由驱动程序再交给 Socket ,应用程序就能够从这个 Socket 中读取接收到的数据。网络应用程序就是这样经过 Socket 发送和接收的。
Socket数据发送过程:
Socket数据接收过程:
Java中的InetAddress是一个表明IP地址的封装。IP地址能够由字节数组和字符串来分别表示,InetAddress将IP地址以对象的形式进行封装,能够更方便的操做和获取其属性。InetAddress没有构造方法,能够经过两个静态方法得到它的对象。
//根据主机名来获取对应的InetAddress实例 InetAddress ip = InetAddress.getByName("www.baidu.com"); //判断是否可达 System.out.println("baidu是否可达:" + ip.isReachable(2000)); //获取该InetAddress实例的IP字符串 System.out.println(ip.getHostAddress()); //根据原始IP地址(字节数组形式)来获取对应的InetAddress实例 InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1}); System.out.println("本机是否可达:" + local.isReachable(5000)); //获取该InetAddress实例对应的全限定域名 System.out.println(local.getCanonicalHostName());
网络中的URL(Uniform Resource Locator)是统一资源定位符的简称。它表示Internet上某一资源的地址。经过URL咱们能够访问Internet上的各类网络资源,好比最多见的WWW,FTP站点。 URL能够被认为是指向互联网资源的“指针”,经过URL能够得到互联网资源相关信息,包括得到URL的InputStream对象获取资源的信息,以及一个到URL所引用远程对象的链接URLConnection。 URLConnection对象能够向所表明的URL发送请求和读取URL的资源。一般,建立一个和URL的链接,须要以下几个步骤:
这里须要重点讨论一下第三步:若是只是发送GET方式请求,使用connect方法创建和远程资源的链接便可;若是是须要发送POST方式的请求,则须要获取URLConnection对象所对应的输出流来发送请求。这里须要注意的是,因为GET方法的参数传递方式是将参数显式追加在地址后面,那么在构造URL对象时的参数就应当是包含了参数的完整URL地址,而在得到了URLConnection对象以后,就直接调用connect方法便可发送请求。而POST方法传递参数时仅仅须要页面URL,而参数经过须要经过输出流来传递。另外还须要设置头字段。如下是两种方式的代码:
//1. 向指定URL发送GET方法的请求 String urlName = url + "?" + param; URL realUrl = new URL(urlName); //打开和URL之间的链接 URLConnection conn = realUrl.openConnection(); //设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); //创建实际的链接 conn.connect(); //2. 向指定URL发送POST方法的请求 URL realUrl = new URL(url); //打开和URL之间的链接 URLConnection conn = realUrl.openConnection(); //设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); //发送POST请求必须设置以下两行 conn.setDoOutput(true); conn.setDoInput(true); //获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); //发送请求参数 out.print(param);
这两个类能够别用于将application/x-www-form-urlencoded MIME类型的字符串转换为普通字符串,将普通字符串转换为这类特殊型的字符串。使用URLDecoder类的静态方法decode()用于解码,URLEncoder类的静态方法encode()用于编码。具体使用方法以下:
//将application/x-www-form-urlencoded字符串转换成普通字符串 String keyWord = URLDecoder.decode("%E6%9D%8E%E5%88%9A+j2ee", "UTF-8"); System.out.println(keyWord); //将普通字符串转换成 application/x-www-form-urlencoded字符串 String urlStr = URLEncoder.encode( "ROR敏捷开发最佳指南" , "GBK"); System.out.println(urlStr);
网络上的两个程序经过一个双向的通信链接实现数据的交换,这个双向链路的一端称为一个Socket。Socket一般用来实现客户方和服务方的链接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号惟一肯定。 可是,Socket所支持的协议种类也不光TCP/IP一种,所以二者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 Server端Listen(监听)某个端口是否有链接请求,Client端向Server端发出Connect(链接)请求,Server端向Client端发回Accept(接受)消息。一个链接就创建起来了。Server端和Client端均可以经过Send,Write等方法与对方通讯。 TCP Socket的通讯过程以下图:
UDP协议是一种不可靠的网络协议,它在通信实例的两端个创建一个Socket,但这两个Socket之间并无虚拟链路,这两个Socket只是发送和接受数据报的对象。 包java.net中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通讯,DatagramSocket用于在程序之间创建传送数据报的通讯链接, DatagramPacket则用来表示一个数据报。 DatagramSocket的构造方法:
DatagramSocket(); DatagramSocket(int prot); DatagramSocket(int port, InetAddress laddr);
其中,port指明socket所使用的端口号,若是未指明端口号,则把socket链接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,不然会生成SocketException类例外。注意:上述的两个构造方法都声明抛弃非运行时例外SocketException,程序中必须进行处理,或者捕获、或者声明抛弃。 用数据报方式编写client/server程序时,不管在客户方仍是服务方,首先都要创建一个DatagramSocket对象,用来接收或发送数据报,而后使用DatagramPacket类对象做为传输数据的载体。
- 网络编程的核心是IP、端口、协议三大元素
- 网络编程的本质是进程间通讯
- 网络编程的2个主要问题:1是定位主机,2是数据传输