勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了 多線程的鎖(六),如果沒有看過,請觀看上一章
網絡編程,是很重要的,一定要掌握的。
關於網絡編程,需要掌握 InetAddress 和 InetSocketAddress 等類。
一. InetAddress 類
InetAddress 是將主機名與ip地址進行關聯的類, 指的是哪一個主機。
一.一 方法
一.一.一 構造方法
一.一.一.一 方法
方法 | 作用 |
---|---|
getByName(String host) | 根據主機名或者ip獲取主機 |
getLocalHost() | 獲取本機 |
一.一.一.二 演示
@Test
public void conTest(){
//1. 根據主機名獲取
try {
InetAddress inetAddress=InetAddress.getByName("www.baidu.com");
System.out.println("輸出ip:"+inetAddress.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
// 百度的 ip 地址
try {
InetAddress inetAddress1=InetAddress.getByName("39.156.66.14");
System.out.println("輸出名稱:"+inetAddress1.getHostName());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//獲取當地的
try {
//等價於 localhost ,獲取的並不是 127.0.0.1, 而是ipconfig的值
InetAddress inetAddress2=InetAddress.getLocalHost();
System.out.println("名稱:"+inetAddress2.getHostName());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
運行程序,控制檯打印輸出:
一.一. 二 其他常用方法
方法 | 作用 |
---|---|
String getHostAddress() | 獲取主機 |
boolean isReachable(int timeout) | 指定時間內是否可達 |
一.二 演示 InetAddress
@Test
public void methodTest() throws Exception{
//獲取當地的
InetAddress inetAddress=InetAddress.getLocalHost();
System.out.println("輸出主機名:"+inetAddress.getHostName());
System.out.println("輸出主機地址:"+inetAddress.getHostAddress());
System.out.println("完全限定域名:"+inetAddress.getCanonicalHostName());
//在指定的時間內是否可達
System.out.println("判斷是否可達:"+inetAddress.isReachable(200));
//yuezl/192.168.190.1
System.out.println("ip地址:"+inetAddress.toString());
}
運行程序,控制檯打印輸出:
二. InetSocketAddress 類
指出 具體的哪個主機的哪個端口
二.一 方法
二.一.一 構造方法
二.一.一.一 方法
方法 | 作用 |
---|---|
InetSocketAddress(String hostname, int port) | 傳入主機名和端口號 |
InetSocketAddress(InetAddress addr, int port) | 傳入 inetAddress對象和端口號 |
靜態方法獲取對象 | |
static InetSocketAddress createUnresolved(String host, int port) | 從主機名和端口號創建未解析的套接字地址。 |
二.一.一.二 演示
@Test
public void conTest(){
//放置主機名和端口
InetSocketAddress inetSocketAddress=new InetSocketAddress("localhost",999);
//第二種方式
InetAddress inetAddress= null;
try {
inetAddress = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
e.printStackTrace();
}
InetSocketAddress inetSocketAddress1=new InetSocketAddress(inetAddress,999);
//3. 通過靜態方法獲取
InetSocketAddress inetSocketAddress2=InetSocketAddress.createUnresolved("localhost",999);
}
二.一.二 其他常用方法
方法 | 作用 |
---|---|
String getHostName() | 獲取主機名 |
int getPort() | 獲取端口號 |
InetAddress getAddress() | 獲取 inetAddress對象 |
二.二 演示 InetSocketAddress
@Test
public void methodTest() throws Exception{
//1. 實例化本地的
InetSocketAddress inetSocketAddress=new InetSocketAddress("localhost",999);
//.獲取主機名
System.out.println("主機名:"+inetSocketAddress.getHostName());
System.out.println("獲取端口:"+inetSocketAddress.getPort());
System.out.println("獲取 hostString:"+inetSocketAddress.getHostString());
InetAddress inetAddress=inetSocketAddress.getAddress();
System.out.println("判斷是否可達:"+inetAddress.isReachable(200));
}
運行程序,控制檯打印輸出
三. URL 類
指定網絡的具體的地址, 可以帶請求參數和描點,能夠精確的定位到地址。
三.一 方法
三.一.一 構造方法
三.一.一.一 方法
方法 | 作用 |
---|---|
URL(String spec) | 直接傳入 url 字符串地址 |
URL(String protocol, String host, int port, String file) | 傳入協議,主機名,端口和具體的地址 |
三.一.一.二 演示
@Test
public void conTest(){
try {
//1. 第一種方式
URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");
} catch (MalformedURLException e) {
e.printStackTrace();
}
//2. 第二種
try {
URL url1=new URL("https","blog.csdn.net",80,"yjltx1234csdn/article/details/105459342");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
三.一.二 其他方法
方法 | 作用 |
---|---|
String getProtocol() | 獲取協議名稱 |
String getHost() | 獲取主機 |
int getPort() | 獲取端口號,如果傳入了,則能獲取到,沒有傳入,則返回 -1 |
int getDefaultPort() | 獲取默認的端口號,如 80,21,443等 |
String getFile() | 獲取完整的路徑名 |
String getPath() | 只獲取路徑部分 |
String getQuery() | 獲取查詢參數部分 |
String getRef() | 獲取描點 |
文件流部分: | |
InputStream openStream() | 將該文件變成輸入流的形式 |
爬蟲部分: | |
URLConnection openConnection() | 變成 URLConnection 部分 |
三.二 演示 URL
三.二.一 RESTFUL 的地址形式
@Test
public void operTest() throws Exception{
//1. 構造對象, restful 的形式
URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");
System.out.println("獲取協議:"+url.getProtocol());
System.out.println("獲取主機:"+url.getHost());
System.out.println("獲取端口:"+url.getPort());
System.out.println("獲取默認端口:"+url.getDefaultPort());
System.out.println("獲取地址:"+url.getFile());
//變成流,讀取相應的文件信息. 注意,不一定所有的url都可以進行轉換。
InputStream inputStream=url.openStream();
int len=-1;
byte[] bytes=new byte[1024];
StringBuilder sb=new StringBuilder();
while((len=inputStream.read(bytes))!=-1){
String temp=new String(bytes,0,len);
sb.append(temp);
}
System.out.println("文件內容是:\n"+sb.toString());
//打開connection,關於 urlConnection,後面會講解
URLConnection connection=url.openConnection();
}
運行程序,查看控制檯輸出:
能夠查詢出文件的內容信息。
三.二.二 正常的ur地址
@Test
public void oper1Test() throws Exception{
URL url=new URL("https://www.baidu.com:80/TwoButterfly/index.html?uname=兩個蝴蝶飛&age=24#a");
System.out.println("獲取路徑path:"+url.getPath()); ///TwoButterfly/index.html
System.out.println("獲取查詢部分:"+url.getQuery()); //uname=兩個蝴蝶飛&age=24
System.out.println("獲取描點:"+url.getRef()); //a
System.out.println("獲取userInfo:"+url.getUserInfo());//null
}
運行程序,查看控制檯輸出:
四. URLConnection類
程序與 url 進行通信, 是一個非常重要的類。
用 URLConnection 類,主要可以獲取網絡地址 url 的相應的信息, 可以模擬瀏覽器的訪問,達到爬蟲的目的。
四.一 方法
四.一.一 構造方法
四.一.一.一 方法
方法 | 作用 |
---|---|
URLConnection openConnection() | 變成 URLConnection 部分 |
四.一.一.二 演示
@Test
public void conTest() throws Exception{
URL url=new URL("https://blog.csdn.net/yjltx1234csdn/article/details/105459342");
//url 獲取的方法
URLConnection urlConnection=url.openConnection();
}
四.一.二 其他方法
方法 | 作用 |
---|---|
String getContentEncoding() | 獲取編碼方式 |
String getContentType() | 獲取 content-type的值 |
void setConnectTimeout(int timeout) | 設置連接超時時間 |
void setRequestProperty(String key, String value) | 設置請求訪問的屬性,模擬瀏覽器訪問 |
InputStream getInputStream() | 獲取輸入流 |
OutputStream getOutputStream() | 獲取輸出流 |
四.二 演示URLConnection 爬蟲
四.二.一 爬取沒有設置禁止爬蟲的網址
@Test
public void pa1Test() throws Exception{
URL url=new URL("https://www.jd.com");
// URL url=new URL("https://www.dianping.com");
InputStream inputStream=url.openStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String temp=null;
while(null!=(temp=bufferedReader.readLine())){
System.out.println(temp);
}
//關閉流
bufferedReader.close();
inputStream.close();
}
運行程序,查看控制檯輸出
如果不允許爬蟲,如 dianping 網的話,那麼會拋出異常
java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.dianping.com
四.二.二 模擬瀏覽器進行訪問爬取
@Test
public void pa2Test() throws Exception{
URL url=new URL("https://www.dianping.com");
//模擬瀏覽器,因爲瀏覽器可以訪問
HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
//設置請求方式
httpURLConnection.setRequestMethod("GET");
//設置時間
httpURLConnection.setReadTimeout(2000);
//設置瀏覽器
httpURLConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/77.0");
//設置語言
httpURLConnection.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,
en-US;q=0.3,en;q=0.2");
InputStream inputStream=httpURLConnection.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String temp=null;
while(null!=(temp=bufferedReader.readLine())){
System.out.println(temp);
}
//關閉流
bufferedReader.close();
inputStream.close();
}
運行程序,查看控制檯輸出打印
謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!