Java网络编程初步
计算机网络 TCP/UDP B/S C/S http协议
基本概念
通讯协议:对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准
通信接口:两个节点之间进行对话必须在他们之间建立通信工具即接口,使彼此之间能进行信息交换。接口包括硬件装置和软件装置
网络分层:OSI开放系统能够互连参考模型 TCP/IP传输控制/网际协议
数据封装
数据拆封
IP
InetAddress:
1.getLocalHost:本机
2.getByName:根据域名DNS|IP地址
代码实例
package cn.chenye.loc;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* IP地址测试:定位一个节点 :计算机 路由 通信设备
* @author ASUS
*
*/
public class IPTest {
public static void main(String[] args) throws UnknownHostException {
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();//创建对象 即本机
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(addr.getHostAddress());//返回本机IP
System.out.println(addr.getHostName());//输出计算机名
//根据域名获取InetAddress对象
addr=InetAddress.getByName("www.csdn.blog.com");
System.out.println(addr.getHostAddress());//返回本机IP
System.out.println(addr.getHostName());//输出计算机名
}
}
端口
一个16位的二进制整数,0-65535 cmd指令netstat -ano查看本地端口
- 8080–》tomcat
- 1521–》oracle
- 3306–》mySQL
package cn.chenye.loc;
import java.net.InetSocketAddress;
/**
* 端口
* @author ASUS
*
*/
public class PortTest {
public static void main(String[] args) {
//包含端口
InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);
InetSocketAddress socketAddress2=new InetSocketAddress("localhost",9000);
System.out.println(socketAddress.getHostName());
System.out.println(socketAddress2.getAddress());
System.out.println(socketAddress2.getHostString());
}
}
URL
URI:URL+URN 统一资源标志符 统一资源定位符 统一资源名称
package cn.chenye.loc;
import java.net.MalformedURLException;
import java.net.URL;
public class URLTest {
public static void main(String[] args) throws MalformedURLException {
URL url=new URL("https://blog.csdn.net/qq_43721475/article/details/104281412");
System.out.println("协议"+url.getProtocol());
System.out.println("域名|ip"+url.getHost());
System.out.println("请求资源"+url.getFile());
System.out.println("请求资源"+url.getPath());
System.out.println("端口"+url.getPort());
//参数
System.out.println(url.getQuery());
//锚点
System.out.println(url.getRef());
}
}
爬虫原理
- 获取URL
- 下载资源
- 分析数据
- 处理数据 清理 存储等
实例1 爬取京东网站源码
package cn.chenye.loc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Spider
* @author ASUS
*
*/
public class SpiderTest {
public static void main(String[] args) throws IOException {
//1. 获取URL
URL u=new URL("https://www.jd.com");
//URL u=new URL("https://www.dianping.com");
//2. 下载资源
InputStream is=u.openStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is,"UTF-8"));
String msg=null;
while(null!=(msg=br.readLine())) {
System.out.println(msg);
}
br.close();
//3. 分析数据
//4. 处理数据 清理 存储等
}
}
但是如果尝试用此方法爬取大众点评发现出现错误403,没有权限,这里提供另一种方法
package cn.chenye.loc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Spider
* @author ASUS
*
*/
public class SpiderTest2 {
public static void main(String[] args) throws IOException {
//1. 获取URL
//URL u=new URL("https://www.jd.com");
URL u=new URL("https://www.dianping.com");
//2. 下载资源
HttpURLConnection con=(HttpURLConnection)u.openConnection();
//模拟浏览器的GET请求
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent"," Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0");
BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
String msg=null;
while(null!=(msg=br.readLine())) {
System.out.println(msg);
}
br.close();
//3. 分析数据
//4. 处理数据 清理 存储等
}
}
打开https://www.dianping.com,f12打开控制台,在network中查看User-agent
传输协议
TCP协议(传输控制协议)特点:
1、面向连接的传输层协议,占用系统资源多、效率低
2、点到点的通信,每一条TCP连接只能有两个端点,及只能是一对一的
3、TCP提供可靠交付的服务,高可靠性
4、TCP提供全双工通信
5、面向字节流
UDP协议:User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能都到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,每个被传输的数据包必须限定在64k之内。
- 非面向连接,传输不可靠,可能丢失
- 发送不管对面是否准备好,接收方收到也不确认
- 可以广播发送
- 非常简单的协议,开销小
套接字Socket
在应用层和传输层之间,是使用套接字来进行分离
UDP编程
使用基于UDP协议的Socket网络编程实现,不需要利用IO流实现数据的传输,每一个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地
数据发送
package cn.chenye.loc;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 发送
* 1.使用DatagramSocket 指定端口 创建发送端
* 2.准备容器 一定转成字节数组
* 3.封装成DatagramSocket包裹 需要指定目的地
* 4.发送包裹send
* 5.释放资源
* @author ASUS
*
*/
public class UDPClient {
public static void main(String[] args) throws Exception {
System.out.println("发送方启动中。。。。");
//1.使用DatagramSocket 指定端口 创建发送端
DatagramSocket client=new DatagramSocket(8880);
// 2.准备容器 一定转成字节数组
String data="chenye handsome";
byte[] datas=data.getBytes();
//3.封装成DatagramSocket包裹 需要指定目的地
DatagramPacket packet=new DatagramPacket(datas,0,datas.length,
new InetSocketAddress("localhost",6666));
// 4.发送包裹send
client.send(packet);
// 5.释放资源
client.close();
}
}
数据接收
package cn.chenye.loc;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 接收
* 1.使用DatagramSocket 指定端口 创建接收端
* 2.准备容器 封装成DatagramSocket 包裹
* 3.阻塞式接收包裹receive
* 4.分析数据
* byte[] getData() getLength()
* 5.释放资源
* @author ASUS
*
*/
//出错原因:同一个协议下,端口不允许重复
public class UDPServer {
public static void main(String[] args) throws Exception {
System.out.println("接收方启动中。。。。");
//1.使用DatagramSocket 指定端口 创建接收端
DatagramSocket serve=new DatagramSocket(6666);
//* 2.准备容器 封装成DatagramSocket 包裹
byte[] container=new byte[1024*60];
DatagramPacket packet= new DatagramPacket(container,0,container.length);
//* 3.阻塞式接收包裹receive
serve.receive(packet);
//* 4.分析数据
byte[] datas=packet.getData();
int len=packet.getLength();
System.out.println(new String(datas,0,len));
//* byte[] getData() getLength()
//* 5.释放资源
serve.close();
}
}
//出错原因:同一个协议下,端口不允许重复
保证端口不被占用,修改端口后