网络编程的上层是应用,底层是关注数据如何传输,如何的存储的。
1.IP地址
( IP) 是 Internet Protocol 的外语缩写,表示节点, 网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。
分为 : IPV4(4个字节,32位) IPV6 (128位) 特殊IP: 192.168.0.0~192.168.255.255 非注册IP,供组织内部使用 127.0.0.1 本地IP localhost : 本地域名 域名与IP之间的关系: DNS解析器
注:InetAddress 类表示Internet协议(IP)地址
//实例代码-IP
public class Class001_IP {
public static void main(String[] args) throws UnknownHostException {
//static InetAddress getByName(String host) 根据主机名称确定主机的IP地址。
//static InetAddress getLocalHost() 返回本地主机的地址。
InetAddress address1 = InetAddress.getLocalHost();
System.out.println(address1); //DESKTOP-KHNV6UD/192.168.16.236
System.out.println(address1.getHostName());
System.out.println(address1.getHostAddress());
InetAddress address2 = InetAddress.getByName("www.baidu.com");
System.out.println(address2);
System.out.println(address2.getHostName());
System.out.println(address2.getHostAddress());
}
}
2.端口(port)
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。可区分不同的软件。
端口 : 区分软件 端口号 2个字节 0~65535 同一协议下端口号不能冲突 建议使用8000以上的,8000以下称为预留端口好 常见的端口: 80 : http 8080 : tomcat 1521 : Oracle 3306 : Mysql
注:InetSocketAddress 此类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口)
//实例代码-端口(Port)
public class Class002_Port {
public static void main(String[] args) {
//InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
//InetSocketAddress(InetAddress addr, int port) 根据IP地址和端口号创建套接字地址。
InetSocketAddress in = new InetSocketAddress("localhost",8989);
System.out.println(in);//返回 InetAddress 对象
System.out.println(in.getHostName());//返回域名
System.out.println(in.getPort());//返回端口
}
}
3.URL
URL全称是Uniform Resource Location,也就是统一资源位置。实际上,URL就是一种特殊的URI,它 除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以通过它来获取URL对应的资源。(互联网中资源的指针,统一资源定位符)
组成: 协议: http 域名: www.baidu.com 端口号: 80 资源: index.html 提交数据: name=zhangsan&pwd=123 锚点: #a
互联网的三大基石:html、http、URL
//实例代码-URL
public class Class003_URL {
public static void main(String[] args) throws MalformedURLException {
//URL(String spec) 从 String表示创建 URL对象。
//URL(String protocol, String host, int port, String file)
URL url = new URL("https://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");
System.out.println(url);
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("资源:"+url.getPath());
System.out.println("资源:"+url.getQuery());
System.out.println("资源:"+url.getRef());
}
}
4.网络爬虫的原理
//实例代码-简单的爬虫理解爬虫原理
public class Class004_Spider {
public static void main(String[] args) throws IOException {
//1.定义URL
URL url = new URL("https://www.baidu.com/index.html");
//2.获取流 : InputStream openStream() 打开与此 URL的连接并返回 InputStream以从该连接读取。
InputStream is = url.openStream();
//InputStreamReader 字节输入流转位字符输入流的节点流-->功能流
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String msg = null;
//3.读入操作
while((msg = rd.readLine())!=null){
System.out.println(msg);
}
//4.关闭
rd.close();
is.close();
}
}
5.传输层协议
先来了解下什么是套接字?
套接字: 传输层为应用层开辟的小口子 不同协议下Socket实现不同 UDP与TCP协议对Socket实现
(1)UDP编程
UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、效率高
UDP协议下发送端与接收端两端平等
DatagramSocket 此类表示用于发送和接收数据报包的套接字。
DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p) 从此套接字接收数据报包。
void send(DatagramPacket p) 从此套接字发送数据报包。
DatagramPacket 该类表示数据报包。
byte[] getData() 返回数据缓冲区。
int getLength() 返回要发送的数据的长度或接收的数据的长度。
注:数据的传输基于字节数组
UDP实现发送端: 基本流程 ①创建客户端 DatagramSocket类 +指定端口 (定义客户端的监听端口) ②准备数据 字节数组
③封装成数据包 需要指定包发送的地址+端口 即服务器地与端口 (打包要发送的数据)
④发送数据
⑤关闭释放资源
//实例代码-UDP实现客户端
public class Class001_Send {
public static void main(String[] args) throws IOException {
// 1.定义我是发送端
DatagramSocket s = new DatagramSocket(9090);
System.out.println("-------------我是发送端-------------");
// 2.准备数据
byte[] arr = "你好".getBytes();
// 3.打包
DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("127.0.0.1",8989));
// 4.发送
s.send(packet);
// 5.关闭
s.close();
}
}
UDP实现接收端: ①定义接收端创建服务器 DatagramSocket类+指定端口
②准备接收容器字节数组 +封装成DatagramPacket数据报 (准备容器接收数据)
③接收数据
④分析处理数据
⑤关闭释放资源
//实现代码-UDP实现发送端
public class Class002_Receive {
public static void main(String[] args) throws IOException {
//1.定义我是接收端
DatagramSocket r = new DatagramSocket(8989);
System.out.println("-----------我是接收端------------");
//2.准备字节数组,打包
byte[] arr = new byte[1024];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
//3.接收数据
r.receive(packet);
//4.处理数据
//byte[] getData() 返回数据缓冲区。
//int getLength() 返回要发送的数据的长度或接收的数据的长度。
byte[] newArr = packet.getData();
int len = packet.getLength();
System.out.println(new String(newArr,0,len));
//5.关闭
r.close();
}
}
(2)TCP 编程(重要)
TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低。
transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),类似于拨打电话。(tcp协议下传输数据基于IO流)
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
• Socket:发送 TCP 消息
Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
InputStream getInputStream()
OutputStream getOutputStream()
TCP实现客户端:
1.定义我是客户端-->指定要请求的服务器的IP+端口
2.准备数据
3.获取输出流
4.输出-->IO操作
5.刷出
6.关闭
//实例代码- TCP协议实现客户端
public class Class001_Client {
public static void main(String[] args) throws IOException {
System.out.println("-----------我是客户端--------------");
// 1.定义我是客户端-->指定要请求的服务器的IP+端口
Socket client = new Socket("localhost",9999);
System.out.println("-----------与服务器端建立连接--------------");
// 2.准备数据
String str = "你好";
// 3.获取输出流
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
// 4.输出-->IO操作
os.writeUTF(str);
// 5.刷出
os.flush();
// 6.关闭
os.close();
client.close();
}
}
TCP实现服务器端:
①创建服务器 指定端口 创建服务器ServerSocket
②定义ServerSocket的监听端口(在这个端口接收客户端发来的消息
③获取输入流-->接收客户端的请求数据
④处理数据
⑤关闭
//实例代码-TCP实现服务器端
public class Class002_Server {
public static void main(String[] args) throws IOException {
System.out.println("-----------我是服务器端-----------");
// 1.定义我是服务端,建立服务器端套接字
ServerSocket server = new ServerSocket(9999);
// 2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------一个客户端连接成功----------");
// 3.获取输入流-->接收客户端的请求数据
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
String msg = is.readUTF();
// 4.处理数据
System.out.println(msg);
// 5.关闭
is.close();
client.close();
server.close();
}
}