Java Xiaobai Learning Guide [day30] --- Web Basics-Network Programming & Http Protocol & Custom Web Server

1. Programação de rede de computadores

1. Por que aprender programação de rede

① Gravar arquivos html no disco local, que podem ser abertos e acessados ​​por meio de um navegador;

②, visite o software / arquivo / site de outras pessoas -> protocolo + endereço (ip) + porta

③, abra o servidor web

2. Conscientização da Internet

A rede é dividida em: rede de área local, rede de área ampla (World Wide Web)

IP: ip é um identificador único na mesma rede; pode ser verificado na janela do DOS ipconfig; ao mesmo tempo ping 域名, o ip correspondente a este nome de domínio pode ser verificado no DOS .

Classificação de IP:

Categoria A: deixada para agências governamentais

Categoria B: empresas de médio porte

Categoria C: qualquer pessoa que precise

Classe D: usado para multicast

Tipo E: para experimento

Insira a descrição da imagem aqui

Atualmente o ipv4 é usado principalmente, o ipv6 está em fase experimental e algumas instituições experimentais estão usando, 128 bits, divididos em 8 segmentos, valores hexadecimais de 0000 a FFFF.

A maneira de obter ip em java: 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. Porto

Os números das portas são usados ​​para distinguir aplicativos diferentes. Dois programas no mesmo computador não podem usar a mesma porta e ocorrerão conflitos. O intervalo do número da porta no computador é 0-65535, dos quais 0-1023 são reservados pelo sistema.

Para acessar um computador, se você não inserir o número da porta, a porta 80 será encontrada por padrão.

número da porta mysql: 3306

número da porta tomcat: 8080

4, URI de soma de URL

URL: Uniform Resource Locator (protocolo: // ip: porta / caminho do recurso)

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

URI: Caminho Uniforme de Recursos

/class_info/java_jichu.html

Exercício: Rastreie as informações de um site, por meio da ferramenta de URL

Ideias:

①. Primeiro obtenha o objeto URL por meio do endereço e encontre o site

② Obtenha o fluxo de entrada e leia as informações da página da web

③. Crie um fluxo de saída, use um fluxo de saída de arquivo e escreva diretamente no arquivo

④. Grave o conteúdo do fluxo de entrada no fluxo de saída. Isso é para guiar o pacote commons-io, usando o método de cópia em IOUtils

⑤, Guanliu

	//获取网站需要用到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 e TCP

Ambos são protocolos da camada de transporte e a comunicação de rede é feita por meio deles.

TCP: protocolo de transmissão confiável, baixo desempenho, multiuso, upload e download e outras funções que precisam considerar a segurança (três handshake, quatro ondas de mãos)

UDP: protocolo de transmissão não confiável, alto desempenho, fácil de perder pacotes nessa altura, por isso é mais usado para jogos, chats, etc.

6. Programação de soquete

Socket é um protocolo, que é traduzido como socket (socket é o ponto final da comunicação entre duas máquinas), a programação de socket é suportada em java, e Socket (implementação de socket do cliente) e SeverSocker (serviço de implementação) são fornecidos. End socket)

Ideias:

Insira a descrição da imagem aqui

Código do lado do servidor


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

Código do cliente


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

Dois, protocolo HTTP

O protocolo TCP / IP é um protocolo da camada de transporte, que resolve principalmente como os dados são transmitidos na rede, enquanto o HTTP é um protocolo da camada de aplicação, que resolve principalmente como empacotar dados. (Atingir navegador cross-server)

Observação: o navegador envia dados ao servidor como uma solicitação. Os dados de feedback do servidor para o navegador são uma resposta (resposta);

Insira a descrição da imagem aqui

1. Solicitar cabeçalho

Insira a descrição da imagem aqui

2. Cabeçalho de resposta

Insira a descrição da imagem aqui

3. Códigos de resposta comuns

200: processado com sucesso

404: O recurso solicitado não pode ser encontrado

500: O código do servidor é anormal

Três, servidor web personalizado


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

Acho que você gosta

Origin blog.csdn.net/WLK0423/article/details/110240469
Recomendado
Clasificación