1.多线程的总结:
2.网络编程
注意:网络编程和网页编程不是一个概念(网络编程可以称为是网页的一个基础)
肯定是学类了:
底层还是要用到IO流的;
3.socket
socket(也叫套接字)最初是在Unix系统上开发的网络通信的接口。
后来微软等公司将它移植到了windows下,当然原来unix系统下的还是好用的。
对于socket可以这样理解:
它就是一个函数库,里面包括大量的函数和相应的数据结构,已经实现好了。
它支持网络通信。
程序开发人员可以通过阅读相关的函数文档,了解函数的使用方法,进行网络的编程。
两种形式的socket:流式套接字,对应与TCP协议。
数据报套接字,对应与UDP协议。
-
套接字
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
- java.lang.Object
-
- java.net.SocketAddress
-
- java.net.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
-
套接字
编辑
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都是大写 这在我们以往的学习中是很少见的;
从
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(); } }