多线程总结_网络编程_InetAddress_InetSocketAddress_URL(写一个网络爬虫的第一步爬取百度的主页)_day_32

1.多线程的总结:




2.网络编程

注意:网络编程和网页编程不是一个概念(网络编程可以称为是网页的一个基础)




肯定是学类了:


底层还是要用到IO流的;

3.socket

socket(也叫套接字)最初是在Unix系统上开发的网络通信的接口。
后来微软等公司将它移植到了windows下,当然原来unix系统下的还是好用的。
对于socket可以这样理解:
它就是一个函数库,里面包括大量的函数和相应的数据结构,已经实现好了。
它支持网络通信。
程序开发人员可以通过阅读相关的函数文档,了解函数的使用方法,进行网络的编程。
两种形式的socket:流式套接字,对应与TCP协议

数据报套接字,对应与UDP协议

收藏
990

套接字

 
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。
套接字用(IP地址:端口号)表示。
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

4.

Class InetAddress

static InetAddress getLocalHost()
返回本地主机的地址。 

String getHostAddress()
返回文本显示中的IP地址字符串。
String getHostName()
获取此IP地址的主机名。
static InetAddress getByName(String host)
确定主机名称的IP地址。 

注意:这个类是没有封装端口号的

这个类是没有公开的构造器的  所以他用静态方法返回InetAddress这个方法

package ip;
/**
 * 测试InetAddress
 * 
 */

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo01 {
	public static void main(String[] args) throws UnknownHostException {
		
		// 使用getLocalHost方法创建InetAddress对象
		InetAddress addr = InetAddress.getLocalHost();
		System.out.println(addr.getHostAddress()); // 返回:本机的地址
		System.out.println(addr.getHostName()); // 输出计算机名

		// 根据域名得到InetAddress对象
		addr = InetAddress.getByName("www.163.com");
		System.out.println(addr.getHostAddress()); // 返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName()); // 输出:www.163.com

		// 根据ip得到InetAddress对象
		addr = InetAddress.getByName("61.135.253.15");
		System.out.println(addr.getHostAddress()); // 返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName()); // 输出ip而不是域名。如果这个IP地
												// 址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。
	}
}
5.

Class InetSocketAddress

  • 该类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名。 如果解决方案失败,那么该地址被认为是 未解决的,但在某些情况下仍可以使用,例如通过代理连接。

package ip;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
/**
 * 
 * 这个类其实就是InetAddress加上端口号
 * 他有自己的构造器
 * 
 * @author Wang
 *
 */

public class InetSocketAddress01 {
	
	public static void main(String[] args) throws UnknownHostException {
		InetSocketAddress  address = new InetSocketAddress("192.168.218.1",9);
		address = new InetSocketAddress(InetAddress.getByName("192.168.218.1"),9);//上面的这个构造器实现的方法其实就是这样的  只不过他封装了一下
		System.out.println(address.getHostName());
		System.out.println(address.getPort());
		
		InetAddress addr =address.getAddress();
		System.out.println(addr.getHostAddress());  //返回:地址
		System.out.println(addr.getHostName());  //输出计算机名字
		
	}
}

6.URL


收藏
990

套接字

  编辑
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。
套接字用(IP地址:端口号)表示。
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
package URL;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * 
 * URL的简单例子
 * @author Wang
 *
 */

public class UrlDemo01 {
	public static void main(String[] args) throws MalformedURLException {
		
	
		//绝对路径构建
		URL url = new URL("http://www.baidu.com:80/index.html?uname=bjsxt");
		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.getRef());   //锚点
		System.out.println("参数:"+url.getQuery());//?后面的是参数 :存在锚点  参数会返回null ,不存在,返回参数的内容
		
		
		url = new URL("http://www.baidu.com:80/a/");
		url = new URL(url,"b.txt");              //相对路径的构建
		System.out.println(url.toString());
	}
}

如果不指明资源的相对路径那么我们默认访问的是网页的主页;

我们在这里写一个爬虫的第一步  获取主页的源代码;

注意我们的URL都是大写  这在我们以往的学习中是很少见的;

URL(String spec)

String表示形成一个 URL对象。 
InputStream openStream()
打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。 

注意我们的转换流  , 一般都要与其对应的缓冲流相结合;

一是因为缓冲流能提高他们的读取速度,二是因为缓冲流有方便读取的方法比如说readLine(),而转换流中没有;请注意一下 下面转换流的用法;


package URL;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;

/**
 * 
 * 我们在这里写一个网络爬虫的第一步
 * 
 * @author Wang
 *
 */

public class urlDemo02 {
	public static void main(String[] args) throws IOException {
		
		URL url = new URL("https://www.baidu.com");
		/*InputStream is = url.openStream();
		byte[] flush = new byte[1024];
		int length = 0;
		while((length = is.read(flush)) != -1) {
			System.out.println(new String(flush,0,length));//这里面会有乱码,是因为百度用的是UTF-8的字符集  我们eclipse的默认的编码集是GBK
			//那么我们就想象到用处理流中的转换流(在这里我们也加上缓冲流来加快效率)来改变一下编码的字符集;   乱码的另一个原因 就是字节数不够这里显然不是
		}
		is.close();*/	
		
		/*BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
		String info = null;//用一个字符串来接收一下读取到的字符;
		while((info = br.readLine()) != null) {
			System.out.println(info);//这次我们就不会出现乱码的问题了
			//我们来把他写进一个文件中  文件的格式为.html那样就可以成为一个访问百度的快捷方式了
		}
		br.close()*/
		
		BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
		//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("baidu.html"),"UTF-8"));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("F:/testIO/baidu.html")),"UTF-8"));
		String info = null;//用一个字符串来接收一下读取到的字符;
		while((info = br.readLine()) != null) {
			bw.append(info);
			bw.newLine();
		}
		
		bw.flush();
		bw.close();
		
		br.close();
	}
}


猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80682352