[Construir servidor HTTP] Use Nodejs para construir un servidor HTTP simple

prefacio

Node.js es un tiempo de ejecución multiplataforma de código abierto que puede ejecutar JavaScript en el lado del servidor. Node.js es propiedad y está mantenido por OpenJS Foundation (anteriormente, Node.js Foundation, que se fusionó con JS Foundation), y también es un proyecto de Linux Foundation. Node.js utiliza V8 desarrollado por Google para ejecutar el código, utilizando tecnologías como modelos de entrada y salida asincrónicos, sin bloqueo y basados ​​en eventos para mejorar el rendimiento y puede optimizar el volumen de transmisión y la escala de las aplicaciones. Estas técnicas se utilizan normalmente en aplicaciones en tiempo real con uso intensivo de datos.

La mayoría de los módulos básicos de Node.js están escritos en lenguaje JavaScript. Antes de la aparición de Node.js, JavaScript se usaba generalmente como un lenguaje de programación del lado del cliente, y los programas escritos en JavaScript a menudo se ejecutaban en el navegador del usuario. La llegada de Node.js también permitió que JavaScript se usara para la programación del lado del servidor. Node.js contiene una serie de módulos incorporados, por lo que el programa puede separarse del servidor Apache HTTP o IIS y ejecutarse como un servidor independiente. A continuación se presenta cómo acceder al servidor de windwos node.js bajo el control remoto red pública en unos simples pasos.

1. Instalar el entorno Node.js

Descargue node.js del sitio web oficial, elegimos la instalación de un clic de 64 bits

https://nodejs.org/zh-cn/download/

imagen-20230302141011787

Una vez completada la instalación, abrimos cmd, y el comando de entrada tiene un número de versión normal, lo que indica que la instalación se ha realizado correctamente.Versión de instalación con un clic, la variable de entorno se configurará de forma predeterminada.

node -v

imagen-20230302150424377

2. Crea un servicio node.js

Aquí creamos un servicio nodejs simple localmente y creamos un pequeño juego de página de serpiente para demostración.

Primero cree una carpeta localmente y cree dos archivos nuevos en la carpeta, uno es jsun archivo y un htmlarchivo, que deben colocarse en el mismo directorio y luego abrirse con vscode.

  • game.html文件
  • nodetest.js文件

imagen-20230302155043387

Agregue game.htmlel siguiente htmlcódigo y guárdelo, el siguiente código es un juego de página html (serpiente)

<!DOCTYPE html>
<html>
<head>
	<title>贪吃蛇</title>
	<meta charset="UTF-8">
	<meta name="keywords" content="贪吃蛇">
	<meta name="Description" content="这是一个初学者用来学习的小游戏">
	<style type="text/css">
	*{
     
     margin:0;}
	.map{
     
     margin:100px auto;
		height:600px;
		width:900px;
		background:#00D0FF;
		border:10px solid #AFAEB2;
		border-radius:8px;
	}
	</style>
</head>
 
<body>
<div class="map">
<canvas id="canvas" height="600" width="900">
	
</canvas>
</div>
 
<script type="text/javascript">
 //获取绘制工具
	/*
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");//获取上下文
	ctx.moveTo(0,0);
	ctx.lineTo(450,450);*/
	var c=document.getElementById("canvas");
    var ctx=c.getContext("2d");
    /*ctx.beginPath();
    ctx.moveTo(0,0);
    ctx.lineTo(450,450);
    ctx.stroke();
    */
 
    var snake =[];//定义一条蛇,画蛇的身体
    var snakeCount = 6;//初始化蛇的长度
	var foodx =0;
	var foody =0;
    var togo =0;
    function drawtable()//画地图的函数
    {
     
     
 
 
    	for(var i=0;i<60;i++)//画竖线
    	{
     
     
    		ctx.strokeStyle="black";
    		ctx.beginPath();
    		ctx.moveTo(15*i,0);
    		ctx.lineTo(15*i,600);
    		ctx.closePath();
    		ctx.stroke();
    	}
        for(var j=0;j<40;j++)//画横线
    	{
     
     
    		ctx.strokeStyle="black";
    		ctx.beginPath();
    		ctx.moveTo(0,15*j);
    		ctx.lineTo(900,15*j);
    		ctx.closePath();
    		ctx.stroke();
    	}
    	
    	for(var k=0;k<snakeCount;k++)//画蛇的身体
			{
     
     
			ctx.fillStyle="#000";
			if (k==snakeCount-1)
			{
     
     
				ctx.fillStyle="red";//蛇头的颜色与身体区分开
			}
			ctx.fillRect(snake[k].x,snake[k].y,15,15);//前两个数是矩形的起始坐标,后两个数是矩形的长宽。
			
			}
			//绘制食物	
    		ctx.fillStyle ="black";
	     ctx.fillRect(foodx,foody,15,15);
	     ctx.fill();
    	
    }
 
    
    function start()//定义蛇的坐标
    {
     
     
    	//var snake =[];//定义一条蛇,画蛇的身体
        //var snakeCount = 6;//初始化蛇的长度
		
		for(var k=0;k<snakeCount;k++)
    		{
     
     
    			snake[k]={
     
     x:k*15,y:0};
    			
            }
			
		  drawtable();
          addfood();//在start中调用添加食物函数
 
    }
 
    function addfood()
	{
     
     
	foodx = Math.floor(Math.random()*60)*15; //随机产生一个0-1之间的数
	foody = Math.floor(Math.random()*40)*15;
		
		for (var k=0;k<snake;k++)
		{
     
     
			if (foodx==snake[k].x&&foody==sanke[k].y)//防止产生的随机食物落在蛇身上
			{
     
     	
			addfood();
			}
		}
	
	
	}	
    		
   function move()
   {
     
     
	switch (togo)
	{
     
     
	case 1: snake.push({
     
     x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y}); break;//向左走
	case 2: snake.push({
     
     x:snake[snakeCount-1].x,y:snake[snakeCount-1].y-15}); break;
	case 3: snake.push({
     
     x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y}); break;
	case 4: snake.push({
     
     x:snake[snakeCount-1].x,y:snake[snakeCount-1].y+15}); break;
	case 5: snake.push({
     
     x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y-15}); break;
	case 6: snake.push({
     
     x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y+15}); break;
	default: snake.push({
     
     x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});
	}
    snake.shift();//删除数组第一个元素
   	ctx.clearRect(0,0,900,600);//清除画布重新绘制
   	isEat();
	isDead();
	drawtable();
   } 			
   
   function keydown(e)
   {
     
     
   switch(e.keyCode)
		{
     
     
         case 37: togo=1; break;
		 case 38: togo=2; break;
		 case 39: togo=3; break;
		 case 40: togo=4; break;
		 case 65: togo=5; break;
		 case 68: togo=6; break;
		}
   }
   
   function isEat()//吃到食物后长度加1
   {
     
     
    if(snake[snakeCount-1].x==foodx&&snake[snakeCount-1].y==foody)
   {
     
     
		addfood();
		snakeCount++;
		snake.unshift({
     
     x:-15,y:-15});
   }
   
   }
   //死亡函数
   function isDead()
   {
     
     
    if (snake[snakeCount-1].x>885||snake[snakeCount-1].y>585||snake[snakeCount-1].x<0||snake[snakeCount-1].y<0)
		{
     
     
        

		window.location.reload();
		}
   }
   
    document.onkeydown=function(e)
{
     
     
	keydown(e);
 
} 
window.onload = function()//调用函数
{
     
      
	start();
	setInterval(move,150);
	drawtable();
	
	
 
}
</script>
</body>
</html>

nodetest.jsAgregue el siguiente jscódigo al archivo, el siguiente código significa abrir uno http服务y establecer el 3000número de puerto de escucha

const http = require('http');

//加载文件模块
const fs = require("fs");


const hostname = '127.0.0.1';
//端口
const port = 3000;

const server = http.createServer((req, res) => {
    
    
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/html');
  
  fs.readFile('./game.html', (err, data) => {
    
    
    if (err) throw err;
    console.log(data.toString);
    res.end(data);
  });
  
  
 
});

server.listen(port, hostname, () => {
    
    
  console.log(`Server running at http://${
      
      hostname}:${
      
      port}/`);
});

3. Acceder al servicio node.js

Una vez que hayamos escrito el código correspondiente, iniciamos el servicio. Ingrese el comando en la consola de vscode [tenga en cuenta que debe ingresar el directorio de archivos correspondiente para ejecutar el comando]

node .\nodetest.js

imagen-20230302170633966

Hay un servicio de solicitud de devolución normal en el puerto local 3000, abrimos el navegador, visitamos http://127.0.0.1:3000/, la interfaz de serpiente aparece para indicar el éxito [control del juego: teclado arriba, abajo, izquierda y derecha llaves]

imagen-20230302171105342

4. Penetración de intranet

Aquí usamos cpolar para la penetración de la red interna, admite el protocolo http/https/tcp, no limita el tráfico, no necesita IP de red pública y no necesita configurar enrutadores, es fácil de usar.

4.1 Instalar y configurar la penetración de la intranet cpolar

Sitio web oficial de cpolar: https://www.cpolar.com/

Visite el sitio web oficial de cpolar, registre una cuenta y luego descargue e instale el cliente. Para obtener tutoriales de instalación específicos, consulte el tutorial de documentación del sitio web oficial.

  • Sistema Windows: después de descargar el paquete de instalación del sitio web oficial, haga doble clic en el paquete de instalación e instálelo de forma predeterminada.
  • Sistema Linux: admite secuencias de comandos de instalación automática con un solo clic; consulte la documentación del sitio web oficial para obtener más detalles - Guía de inicio

20230130105715

4.2 Crear un túnel para mapear un puerto local

Una vez que cpolar se haya instalado correctamente, visite el puerto local 9200 http://localhost:9200 en el navegador e inicie sesión con la cuenta de correo electrónico de cpolar.

20230130105810

Haga clic en Gestión de túneles en el panel izquierdo - Crear túnel para crear un túnel http que apunte al puerto local 3000

  • Nombre del túnel: puede personalizar el nombre, tenga cuidado de no duplicar el nombre del túnel existente
  • Protocolo: seleccione http
  • Dirección local: 3000
  • Tipo de nombre de dominio: elija un nombre de dominio aleatorio de forma gratuita
  • Región: Seleccionar China VIP

hacer clic创建

imagen-20230302171633772

Una vez que el túnel se haya creado correctamente, haga clic en el estado de la lista de túneles en línea de la izquierda, vea la dirección de red pública generada y luego copie la dirección.

imagen-20230302171740715

Abra el navegador, usamos la dirección de red pública anterior para acceder, hasta ahora, hemos publicado con éxito el node.jsservicio local en la dirección de red pública

imagen-20230302171817498

5. Dirección de red pública fija

Dado que el túnel anterior creado con cpolar utiliza una dirección de red pública aleatoria, cambiará aleatoriamente dentro de las 24 horas, lo que no es propicio para el acceso remoto a largo plazo. Por lo tanto, podemos configurarle un nombre de subdominio de segundo nivel, que es una dirección fija y no cambiará aleatoriamente.

  • Reserva un subdominio de segundo nivel

Inicie sesión en el sitio web oficial de cpolar, haga clic en Reservar a la izquierda, elija reservar el nombre de subdominio de segundo nivel, establezca un nombre de subdominio de segundo nivel, haga clic en Reservar y copie el nombre de subdominio de segundo nivel reservado después de que la reserva sea exitosa

imagen-20230302172317079

Después de que la reserva sea exitosa, copie la dirección de subdominio de segundo nivel reservada

imagen-20230302172454064

  • Configurar un subdominio de segundo nivel

Visite http://127.0.0.1:9200/, inicie sesión en la interfaz de administración de la interfaz de usuario web de cpolar, haga clic en Administración de túneles en el panel izquierdo - Lista de túneles, busque el túnel 3000 que desea configurar y haga clic en Editar a la derecha

imagen-20230302172856768

Modifique la información del túnel y configure el nombre de subdominio de segundo nivel reservado con éxito en el túnel

  • Tipo de nombre de dominio: seleccione un nombre de subdominio de segundo nivel
  • Subdominio: complete el nombre del subdominio reservado

hacer clic更新

imagen-20230302172806823

Una vez completada la actualización, abra la lista de túneles en línea. En este momento, puede ver que la dirección de la red pública ha cambiado, y el nombre de la dirección también ha cambiado al nombre de subdominio de segundo nivel reservado. Cópielo.

imagen-20230302172935943

Luego use la dirección http fija para abrir el acceso del navegador

imagen-20230302173012863
El acceso es exitoso y ahora la dirección de la red pública es fija y no cambiará aleatoriamente. Penetró con éxito a través de la intranet de cpolar para lograr acceso remoto a los servicios de nodejs, sin necesidad de una IP de red pública o un enrutador.

Reimpreso del artículo de Penetración de Intranet de cpolar: Use Nodejs para construir servicios HTTP y obtenga acceso remoto a la red pública "Penetración de Intranet"

Supongo que te gusta

Origin blog.csdn.net/lxwssjszsdnr_/article/details/130813298
Recomendado
Clasificación