基本知识
IP地址:
用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。 比如互联网的每个服务器都要有自己的IP地址,而每个局域网的计算机要通信也要配置IP地址。路由器是连接两个或多个网络的网络设备。
目前主流使用的IP地址是IPV4,但是随着网络规模的不断扩大,IPV4面临着枯竭的危险,所以推出了IPV6。
IPV4:32位地址,并以8位为一个单位,分成四部分,以点分十进制表示,如192.168.0.1。因为8位二进制的计数范围是00000000---11111111,对应十进制的0-255,所以-4.278.4.1是错误的IPV4地址。
IPV6:128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,每个数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
注意事项
1. 127.0.0.1 本机地址
2. 192.168.0.0--192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用。
package cn.zh.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
*InteAddredd:
* getLocalHost:本机
* getByName:根据域名DNS 或IP地址解析IP地址
* 两个成员方法:
* getHostAddress:返回地址
* getHostName:返回计算机名
*
*/
public class IPTest {
public static void main(String[] args) throws UnknownHostException {
//使用getLocalHost方法创建InetAddress对象。
InetAddress address = InetAddress.getLocalHost();
System.out.println(address.getHostAddress());//获取ip地址
System.out.println(address.getHostName());
//根据域名得到InetAddress对象
address = InetAddress.getByName("www.baidu.com");
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
//根据ip得到InetAddress对象
address = InetAddress.getByName("183.232.231.172");
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
}
}
▪ 端口:
IP地址用来标识一台计算机,但是一台计算机上可能提供多种网络应用程序,如何来区分这些不同的程序呢?这就要用到端口。
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。 端口的表示是一个16位的二进制整数,对应十进制的0-65535。
Oracle、MySQL、Tomcat、QQ、msn、迅雷、电驴、360等网络程序都有自己的端口。
总结
1. IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。
2. IP地址好比为电话号码,而端口号就好比为分机号。
package cn.zh.net;
import java.net.InetSocketAddress;
public class PortTest {
public static void main(String[] args) {
//包含端口
InetSocketAddress socketAddress1 = new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",9000);
System.out.println(socketAddress1.getHostName());//127.0.0.1
System.out.println(socketAddress2.getAddress());//localhost/127.0.0.1
}
}
▪ URL:
在www上,每一信息资源都有统一且唯一的地址,该地址就叫URL(Uniform Resource Locator),它是www的统一资源定位符。URL由4部分组成:协议 、存放资源的主机域名、资源文件名和端口号。如果未指定该端口号,则使用协议默认的端口。例如http 协议的默认端口为 80。 在浏览器中访问网页时,地址栏显示的地址就是URL。
在java.net包中提供了URL类,该类封装了大量复杂的涉及从远程站点获取信息的细节。
package cn.zh.net;
import java.net.URL;
public class URLTest {
public static void main(String[] args) throws Exception{
URL u = new URL("https://www.csdn.net");
System.out.println("获取与此url关联的协议的默认端口"+u.getDefaultPort());
System.out.println("getFile"+u.getFile());
System.out.println("主机"+u.getHost());
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());
}
}
▪ Socket:
我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。
套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。
Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
爬虫原理
package cn.zh.net;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
/**
* 网络爬虫原理
* 1.获取URL
* 2.下载资源
* 3.分析
* 4.处理
*/
public class SpiderTest01 {
public static void main(String[] args) throws Exception {
//1.获取URL
URL url = new URL("https://www.jd.com");
//2.下载资源
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf8"));
String msg = null;
while (null!=(msg=br.readLine())){
System.out.println(msg);
}
br.close();
//3.分析
//4.处理
}
}
package cn.zh.net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 网络爬虫原理+模拟浏览器
*/
public class SpiderTest02 {
public static void main(String[] args) throws Exception {
//1.获取URL
URL url = new URL("https://www.diangping.com");
//2.下载资源
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36");
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf8"));
String msg = null;
while (null != (msg = br.readLine())) {
System.out.println(msg);
}
br.close();
//3.分析
//4.处理
}
}
网络编程udp基本步骤
创建 UdpClisent.java文件
package cn.zh.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
* 发送端
* 1.使用DatagrameSocket指定端口 创建接受端
* 2.准备数据 一定要转成字节数组
* 3.封装成DatagramPacket包裹,需要指定目的地
* 4.发送包裹send(DatagramPacket p)
* 5.释放资源
*/
public class UdpClient {
public static void main(String[] args) throws Exception{
System.out.println("发送方启动中.....");
//使用DatagrameSocket指定端口 创建接受端
DatagramSocket client = new DatagramSocket(8888);
//准备数据 一定要转成字节数组
String data = "上海尚学堂";
byte[] datas = data.getBytes();
//.封装成DatagramPacket包裹,需要指定目的地
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
//发送包裹send(DatagramPacket p)
client.send(packet);
//释放资源
client.close();
}
}
创建UdpServer.java文件
package cn.zh.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端
* 同一协议下端口不允许重复
* 1.使用DatagrameSocket指定端口 创建接受端
* 2.准备容器 封装成DatagramPacket包裹
* 3.阻塞式接收包裹receive(DatagramPacket p)
* 4.分析数据
* byte[] getData()
* getLength()
* 5.释放资源
*/
public class UdpServer {
public static void main(String[] args) throws IOException {
System.out.println("接受方启动中......");
//.使用DatagrameSocket指定端口 创建接受端
DatagramSocket server = new DatagramSocket(9999);
//准备容器 封装成DatagramPacket包裹
byte[] container = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
//阻塞式接收包裹receive(DatagramPacket p)
server.receive(packet);
//分析数据
//byte[] getData()
// getLength()
byte[] datas = packet.getData();
int len = packet.getLength();
System.out.println(new String(datas,0,len));
//释放资源
server.close();
}
}