零基础Java学习笔记(十)

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());
	}
}

爬虫原理

  1. 获取URL
  2. 下载资源
  3. 分析数据
  4. 处理数据 清理 存储等

实例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之内。

  1. 非面向连接,传输不可靠,可能丢失
  2. 发送不管对面是否准备好,接收方收到也不确认
  3. 可以广播发送
  4. 非常简单的协议,开销小

套接字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();
	}

}

//出错原因:同一个协议下,端口不允许重复

在这里插入图片描述
保证端口不被占用,修改端口后
在这里插入图片描述

TCP编程

实例:聊天室程序

这里是一个传送门

发布了38 篇原创文章 · 获赞 11 · 访问量 3847

猜你喜欢

转载自blog.csdn.net/qq_43721475/article/details/104335193