最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

公網(wǎng)遠程訪問Node.js服務【cpolar內(nèi)網(wǎng)穿透】

2023-08-01 10:39 作者:cpolar  | 我要投稿

前言

Node.js 是能夠在服務器端運行 JavaScript 的開放源代碼、跨平臺運行環(huán)境。Node.js 由 OpenJS Foundation(原為 Node.js Foundation,已與 JS Foundation 合并)持有和維護,亦為 Linux 基金會的項目。Node.js 采用 Google 開發(fā)的 V8 運行代碼,使用事件驅(qū)動、非阻塞和異步輸入輸出模型等技術來提高性能,可優(yōu)化應用程序的傳輸量和規(guī)模。這些技術通常用于資料密集的即時應用程序。

Node.js 大部分基本模塊都用 JavaScript 語言編寫。在 Node.js 出現(xiàn)之前,JavaScript 通常作為客戶端程序設計語言使用,以JavaScript 寫出的程序常在用戶的瀏覽器上運行。Node.js 的出現(xiàn)使 JavaScript 也能用于服務端編程。Node.js 含有一系列內(nèi)置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨立服務器運,下面將介紹如何簡單幾步實現(xiàn)遠程公共網(wǎng)絡下訪問windwos node.js的服務端。

1.安裝Node.js環(huán)境

官網(wǎng)下載node.js,我們選擇64位一鍵安裝

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


安裝好后我們打開cmd,出來版本表示安裝成功,一鍵安裝版,默認會配置環(huán)境變量

node -v

2.創(chuàng)建node.js服務

打開vscode工具,這里我們創(chuàng)建兩個文件,一個是js文件和一個html文件,這里做演示,所以兩個文件放在同一個目錄即可

game.html添加如下html代碼,以下代碼是一個html頁面小游戲(貪吃蛇)

<!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()//畫地圖的函數(shù)

? ? {



? ? ? ? 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";//蛇頭的顏色與身體區(qū)分開

? ? ? ? ? ? }

? ? ? ? ? ? ctx.fillRect(snake[k].x,snake[k].y,15,15);//前兩個數(shù)是矩形的起始坐標,后兩個數(shù)是矩形的長寬。


? ? ? ? ? ? }

? ? ? ? ? ? //繪制食物??

? ? ? ? ? ? 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中調(diào)用添加食物函數(shù)


? ? }


? ? function addfood()

? ? {

? ? foodx = Math.floor(Math.random()*60)*15; //隨機產(chǎn)生一個0-1之間的數(shù)

? ? foody = Math.floor(Math.random()*40)*15;


? ? ? ? for (var k=0;k<snake;k++)

? ? ? ? {

? ? ? ? ? ? if (foodx==snake[k].x&&foody==sanke[k].y)//防止產(chǎn)生的隨機食物落在蛇身上

? ? ? ? ? ? {? ?

? ? ? ? ? ? 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();//刪除數(shù)組第一個元素

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

? ?}


? ?}

? ?//死亡函數(shù)

? ?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()//調(diào)用函數(shù)

{?

? ? start();

? ? setInterval(move,150);

? ? drawtable();

}

</script>

</body>

</html>


nodetest.js文件添加如下js代碼,以下代碼意思是開啟一個http服務,設置監(jiān)聽3000端口號


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.訪問node.js 服務

當我們編寫好相關代碼后,我們開始啟動服務.在vscode控制臺輸入命令:

node .\nodetest.js

打開瀏覽器,訪問http://127.0.0.1:3000/,出現(xiàn)貪吃蛇界面表示成功,游戲控制:鍵盤上下左右鍵

4.內(nèi)網(wǎng)穿透

這里我們使用cpolar來進行內(nèi)網(wǎng)穿透,支持http/https/tcp協(xié)議,不限制流量,無需公網(wǎng)IP,也不用設置路由器,使用簡單。

4.1 安裝配置cpolar內(nèi)網(wǎng)穿透

cpolar官網(wǎng):https://www.cpolar.com/

訪問cpolar官網(wǎng),注冊一個賬號,然后下載并安裝客戶端,具體安裝教程可以參考官網(wǎng)文檔教程。

  • windows系統(tǒng):在官網(wǎng)下載安裝包后,雙擊安裝包一路默認安裝即可。

  • linux系統(tǒng):支持一鍵自動安裝腳本,詳細請參考官網(wǎng)文檔——入門指南

4.2 創(chuàng)建隧道映射本地端口

cpolar安裝成功后,在瀏覽器上訪問本地9200端口【http://localhost:9200】,使用cpolar賬號登錄。

點擊左側(cè)儀表盤的隧道管理——創(chuàng)建隧道,創(chuàng)建一個3000端口 http隧道

  • 隧道名稱:可自定義命名,注意不要與已有的隧道名稱重復

  • 協(xié)議:選擇http

  • 本地地址:3000

  • 域名類型:免費選擇隨機域名

  • 地區(qū):選擇China vip

點擊創(chuàng)建

隧道創(chuàng)建成功后,點擊左側(cè)的狀態(tài)——在線隧道列表,查看所生成的公網(wǎng)地址,然后復制地址


打開瀏覽器器,我們使用上面公網(wǎng)地址進行訪問,至此,我們成功將本地node.js 服務發(fā)布到了公網(wǎng)地址


5.固定公網(wǎng)地址

由于以上使用cpolar所創(chuàng)建的隧道使用的是隨機公網(wǎng)地址,24小時內(nèi)會隨機變化,不利于長期遠程訪問。因此我們可以為其配置二級子域名,該地址為固定地址,不會隨機變化【ps:cpolar.cn已備案】

注意需要將cpolar套餐升級至基礎套餐或以上,且每個套餐對應的帶寬不一樣?!綾polar.cn已備案】

保留一個二級子域名

登錄cpolar官網(wǎng),點擊左側(cè)的預留,選擇保留二級子域名,設置一個二級子域名名稱,點擊保留,保留成功后復制保留的二級子域名名稱

保留成功后復制保留的二級子域名地址

訪問http://127.0.0.1:9200/,登錄cpolar web UI管理界面,點擊左側(cè)儀表盤的隧道管理——隧道列表,找到所要配置的3000隧道,點擊右側(cè)的編輯

修改隧道信息,將保留成功的二級子域名配置到隧道中

  • 域名類型:選擇二級子域名

  • Sub Domain:填寫保留成功的二級子域名

點擊更新

更新完成后,打開在線隧道列表,此時可以看到公網(wǎng)地址已經(jīng)發(fā)生變化,地址名稱也變成了保留過的二級子域名名稱,將其復制下來


然后使用固定http地址打開瀏覽器訪問



公網(wǎng)遠程訪問Node.js服務【cpolar內(nèi)網(wǎng)穿透】的評論 (共 條)

分享到微博請遵守國家法律
阳西县| 始兴县| 罗平县| 班戈县| 华池县| 肥西县| 松潘县| 兴宁市| 茌平县| 安达市| 修水县| 红安县| 闽侯县| 凤庆县| 双牌县| 苍南县| 霞浦县| 余江县| 兴安县| 朝阳区| 黔西县| 抚远县| 依兰县| 宁安市| 临汾市| 怀安县| 双江| 资阳市| 东丰县| 皮山县| 甘谷县| 嘉鱼县| 黄大仙区| 镇原县| 普定县| 喀喇沁旗| 工布江达县| 静宁县| 昭平县| 元氏县| 柯坪县|