欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Web基础--网络编程、Http协议、自定义Web服务器

程序员文章站 2022-07-03 20:43:19
一、计算机网络编程1、为什么要学习网络编程​①、本地磁盘编写html文件,可以通过浏览器打开访问;​②、访问别人的软件/文件/网站 -> 协议 + 地址(ip) + 端口​③、开启Web服务器2、网络的认识网络分为:局域网、广域网(万维网)IP:ip是同一网络下唯一标识;在DOS窗口下可以通过ipconfig进行查看;同时在DOS下通过ping 域名可以查看这个域名对应的ip。IP的分类:A类 : 留给*机构B类:中等规模的公司C类:任意需要的人D类:用于组播E类...

一、计算机网络编程

1、为什么要学习网络编程

​ ①、本地磁盘编写html文件,可以通过浏览器打开访问;

​ ②、访问别人的软件/文件/网站 -> 协议 + 地址(ip) + 端口

​ ③、开启Web服务器

2、网络的认识

网络分为:局域网、广域网(万维网)

IP:ip是同一网络下唯一标识;在DOS窗口下可以通过ipconfig进行查看;同时在DOS下通过ping 域名可以查看这个域名对应的ip。

IP的分类:

A类 : 留给*机构

B类:中等规模的公司

C类:任意需要的人

D类:用于组播

E类:用于实验

Java Web基础--网络编程、Http协议、自定义Web服务器

现在主要使用的还是ipv4,ipv6处于实验阶段,部分实验机构在使用,128位,分8段,0000~FFFF的十六进制数值。

java中获取ip的方式: InetAddress

@Test
	public void testGetIP() throws Exception {
		// 返回本地主机名与IP。
		InetAddress localHost = InetAddress.getLocalHost();
		System.out.println(localHost);
		// 返回本地主机名与IP。
		InetAddress byName = localHost.getByName("LAPTOP-QJN7NLRN");
		System.out.println(byName);
		//仅获取当前InetAddress对象的ip
		System.out.println(localHost.getHostAddress());
		//获取淘宝的ip信息
		InetAddress byName2 = InetAddress.getByName("taobao.com");
		System.out.println(byName2);
		System.out.println("淘宝网的ip是:"+byName2.getHostAddress());
	}

3、端口

端口号使用来区分不同应用程序的,同一台计算机上不能够有两个程序使用同一个端口,会发生冲突,计算机上的端口号范围是 为0-65535,其中0~1023被系统所保留 。

访问一台计算机,如果不输入端口号,就会默认找80端口。

mysql端口号 : 3306

tomcat端口号:8080

4、URL和URI

URL:统一资源定位符 (协议://ip: 端口 /资源路径)

例 : http://127.0.0.1:8080/class_info/java_jichu.html

URI:统一资源路径

/class_info/java_jichu.html

练习:抓取一个网站的信息,通过URL工具

思路:

①、首先通过地址获取URL对象,找到网站

②、拿到输入流,读取网页信息

③、创建输出流,用文件输出流,直接写进文件

④、把输入流的内容写入输出流中,这是要导包 commons-io包 ,使用 IOUtils 中的copy方法

⑤、关流

	//获取网站需要用到URL类:
		URL url = new URL("https://douban.com/");
		//获取输入流
		InputStream in = url.openStream();
		//创建接收的文件输出流,作为抓取后的文件输出存放
		FileOutputStream out = new FileOutputStream("文件存放地址.html");
		//传递到输出流中
		IOUtils.copy(in, out);
		//关流
		out.close();
		in.close();
	}

5、UDP与TCP

两个都是传输层协议,通过他们来做网络通讯。

TCP:可靠传输协议,性能较低,多用与上传下载等需要考虑安全性的功能(三次握手、四次挥手)

UDP:不可靠传输协议,性能高,到那时容易丢包,所以多用于游戏、聊天等

6、Socket编程

socket是一种协议,翻译过来叫套接字 (套接字是两台机器间通信的端点),在java中支持socket编程,并且提供了Socket(实现客户端套接字)和SeverSocker(实现服务端套接字)

思路:

Java Web基础--网络编程、Http协议、自定义Web服务器

服务器端代码


public class ServerTest {
	// 先定义serversocket对象
	private ServerSocket ss = null;

	// 创建构造器,在创建服务器端对象的时候,要将服务器端启动
	public ServerTest() throws Exception {
		System.out.println("服务器已经准备就绪");
		// 给定一个端口号,作为监听对象,只要有人调用这个端口,就是需要启动服务器
		ss = new ServerSocket(8989);
		System.out.println("服务端已上线");
	}

	// 创建服务器
	public void start() throws Exception {
		// 需要一直处于等待状态,等待客户端,同时获取socket对象
		Socket socket = ss.accept();
		// 因为数据存在socket中,需要从中获取输入流
		InputStream in = socket.getInputStream();
		// 将输入流进行包装,方便读取,包装进reader
		InputStreamReader is = new InputStreamReader(in,"UTF-8");
		// 再包装进BufferedRader,可以读取一行
		BufferedReader bufferedReader = new BufferedReader(is);
		// 现在可以按行读取数据
		String str = bufferedReader.readLine();
		// 打印从客户端获取的内容
		System.out.println(str);
	}

	// 需要main方法把客户端运行起来
	public static void main(String[] args) throws Exception {
		ServerTest se = new ServerTest();
		se.start();
	}
}

客户端代码


public class ClientTest {
	//先声明客户端socket
	private Socket so = null;
	//创建构造器,在创建客户对象的时候,客户端就要启动
	public ClientTest() throws Exception{
		//需要传入两个参数,分别是IP,和端口号
		so = new Socket("127.0.0.1",8989);
	}
	//客户端执行功能
	public void start() throws Exception{
		//首先从socket中拿到输出流
		OutputStream out = so.getOutputStream();
		//包装进writer方便输出
		OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");
		//这里有两种方式,可以直接输出(注意换行,因为服务端是按行读取),然后刷新flush,就可以输出了;
		//也可以再次进行包装,包装进PrintWriter【打印流】,要注意第二个参数是是否自动刷新
		PrintWriter printWriter = new PrintWriter(writer,true);
		//可以输出换行加刷新
		printWriter.println("嗨!你听到了吗!我再叫你!");
	}
	//需要main方法将客户端运行起来
	public static void main(String[] args) throws Exception {
		ClientTest client = new ClientTest();
		client.start();
	}
}

二、HTTP协议

TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。(实现浏览器的跨服务器)

注意:浏览器给服务器发送数据是一次请求(request)。服务器给浏览器反馈数据是一次响应(response);

Java Web基础--网络编程、Http协议、自定义Web服务器

1、请求头

Java Web基础--网络编程、Http协议、自定义Web服务器

2、响应头

Java Web基础--网络编程、Http协议、自定义Web服务器

3、常见的响应码

200:处理成功

404:请求资源找不到

500:服务端代码异常

三、自定义Web服务器


public class Webserver {
	private ServerSocket ss = null;

	public Webserver() throws Exception {
		ss = new ServerSocket(8888);
	}

	public void start() throws Exception {
		System.out.println("准备中...");
		// 等待且获取socket对象
		Socket socket = ss.accept();
		//可以获取当前访问这IP
		System.out.println(socket.getLocalAddress().getHostAddress());
		// 获取socket中的输入流
		System.out.println("进入!");
		// 现在需要读取一个html文件作为返回,使用文件输入流
		FileInputStream fileInputStream = new FileInputStream(
				"本地地址.html");
		// 读取文件输入流中的内容
		InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
		// 再次包装,还是使用bufferedreader
		BufferedReader reader = new BufferedReader(inputStreamReader);
		// String readLine = reader.readLine();
		// 现在已经有了输入流,需要进行输出,浏览器已经获取到socket了,所以直接获取输出流
		OutputStream out = socket.getOutputStream();
		// 现在进行包装
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out, "UTF-8");
		// 再次包装进打印流,printwriter
		PrintWriter writer = new PrintWriter(outputStreamWriter, true);
		/**
		 * 非常关键的代码,需要告诉浏览器,我是HTTP响应
		 */
		writer.println("HTTP/1.1 200 OK"); // 成功响应
		writer.println("Content-Type: text/html;charset=utf-8");// 响应类型与编码
		writer.println();
		// 一行一行的读取数据
		String readLine = "";
		while ((readLine = reader.readLine()) != null) {
			writer.println(readLine);
		}
		// 关流
		outputStreamWriter.close();
		inputStreamReader.close();
	}

	public static void main(String[] args) throws Exception {
		Webserver webserver = new Webserver();
		// 需要一直接收请求
		while (true) {
			webserver.start();
		}
	}
}

本文地址:https://blog.csdn.net/WLK0423/article/details/110240469