1.网络编程
(1)网络编程三要素:
1)IP地址:唯一标识网络上的每一台计算机,两台计算机之间通信的必备因素。
2)端口号:计算机中应用的标记(代表一个应用程序),0-1024系统使用或者保留端口,端口占2个字节,所以有效端口0-65535。
3)通信协议:TCP/UDP
(2)IP地址
IP 地址用于标识网络上的唯一一台计算机,共32位,4个8位二进制数组成IP地址分为:IPv4和IPv6
IPv4:“点分十进制表示法”;
IPv6:“十六进制表示法”;
IP 地址 = 网络 ID+主机 ID
网络 ID:标识计算机或网络设备所有的网段
主机 ID:标识特定的主机或网络设备
特殊 IP 地址:
1) 127.0.0.1:本机回环地址,用于本机测试
2) 255.255.255.255:当前子网,一般用于当前子网广播信息
(3)端口号
端口号:虚拟的概念,使用 0-65535 之间的整数,用于标识不同的应用程序每个网络程序都会至少有一个端口号 。
(4)TCP与UDP的区别
1)TCP(transfer control protocol) (打电话)
一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。
特点 : 面向连接
点到点的通信
高可靠性:三次握手
占用系统资源多、效率低
2) UDP(User DatagramProtocol ) (发短信)
一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
特点 : 非面向连接,传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
数据报的大小限制在 64k 内
非常简单的协议,开销小
2.TCP协议数据传递细节
TCP通信原理:
服务器创建 ServerSocket,在指定端口监听并处理请求。
客户端创建 Socket,向服务器发送请求。
3.UDP协议数据传递细节
(1) 不需要利用 IO 流实现数据的传输。
(2) 每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地。
(3) DatagramSocket:用于发送或接收数据包。
(4) DatagramPacket:数据包。
4.InetAddress 类_InetSocketAddress 类
(1)InetAddress 类(封装了ip地址,但不包含端口号)
1)String getHostAddress(); 获得 IP 地址
2) String getHostName(); 获得主机名
3) static InetAddress getByName(String host); 根据主机名获得 IP 地址
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 获取主机的IP和主机名的方法、
* getHostAddress()获取IP地址
* getHostName()获取主机名
*
* @author ys
*
*/
public class TestInetAddress {
public static void main(String[] args) throws UnknownHostException {
// (1)获取InetAddress的方式
InetAddress ia = InetAddress.getLocalHost();// 本机
System.out.println("获取主机的IP地址:" + ia.getHostAddress());
System.out.println("获取主机的名称:" + ia.getHostName());
// (2)根据域名得到InetAddress对象
InetAddress ia2 = InetAddress.getByName("www.jd.com");
System.out.println("京东服务器的IP地址:" + ia2.getHostAddress());
System.out.println("主机名称:" + ia2.getHostName());
// (3)根据IP地址获取一个InetAddress对象
InetAddress ia3 = InetAddress.getByName("61.135.253.15");
System.out.println("服务器主机IP:" + ia3.getHostAddress());
System.out.println("主机名称:" + ia3.getHostName());
// 如果61.135.253.15IP地址不存在或者DNS(域名解析系统)不允许进行IP地址的和域名的映射
}
}
(2)InetSocketAddress 类(封装了IP地址加上端口号,用于实现IP套接字地址(IP地址+端口号),用于socket 通信)
1) InetAddress getAddress(); 获取 InetAddress 对象
2) int getPort(); 获取端口号
3) String getHostName(); 获取主机名
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class TestInetSocketAddress {
public static void main(String[] args) throws UnknownHostException {
// 创建对象
InetSocketAddress tsa = new InetSocketAddress("localhost", 9999);
InetSocketAddress tsa1 = new InetSocketAddress("127.0.0.1", 9999);
InetSocketAddress tsa2 = new InetSocketAddress("192.168.5.1", 9999);
InetAddress ia = InetAddress.getByName("192.168.41.131");
InetSocketAddress tsa4 = new InetSocketAddress(ia, 9999);
System.out.println("主机名称:" + tsa4.getHostName());
System.out.println("主机IP地址:" + tsa4.getAddress());
}
}
5.URL类
(1)URL(uniform resource locator)
统一资源定位符,由4个部分组成:协议、存放资源的主机域名、端口号和资源文件名。
(2)URL类常用方法
1) String getProtocal() 获取此URL的协议名称
2) String getHost() 获取此URL的主机名(如果适用)
3) int getPort() 获取URL的端口号
4) String getFile() 获取此URL的文件名
5) getDefaultPort() 获取与此URL关联协议的默认端口号
6) getPath() 获取此URL的路径部分
import java.net.MalformedURLException;
import java.net.URL;
/**
* url类中的一些方法,用来获取指定资源的信息
*
* @author ys
*
*/
public class TestURL {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("https://www.baidu.com/index.html");
System.out.println("协议名称:" + url.getProtocol());
System.out.println("主机名称:" + url.getHost());
System.out.println("端口号:" + url.getPort());
System.out.println("获取资源路径:" + url.getPath());
System.out.println("获取资源路径:" + url.getFile());
System.out.println("获取默认端口号:" + url.getDefaultPort());
}
}
7)openStream()方法打开到此URL的连接并返回一个用于从该连接读入的InputStream
可以从指定网址获取字节输入流。可实现从网页爬取信息。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
public class TestURLOpean {
public static void main(String[] args) throws IOException {
/**
* 网络爬虫
* (1)从网络上获取资源www.baidu.com
* (2)存储到本地
*/
// (1)创建URL对象
URL url = new URL("https://www.baidu.com");// 主页资源
// (2)获取字节输入流
InputStream is = url.openStream();
// (3)缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
// (4)存储到本地
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("index.html"), "utf-8"));
// (5)边读边写
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// (6)关闭流
bw.close();
br.close();
}
}