论穷屌丝如何在自己的电脑上搭建服务器

今年要学些计算机网络的知识了,打算学好之后自己做一个小的联机游戏。最好是可以让大家一起玩的。像我这种穷屌丝买不起服务器,只能在自己的电脑上搭建服务器咯。

使用node.js搭建一个简单的服务器

首先可以使用node.js搭建一个简单的服务器(或者你使用python,java也可以):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
"use strict";
const http = require("http");
const fs = require("fs");

const hostname = '127.0.0.1';
const port = 8080;

const index_context = fs.readFileSync("./web/index.html", "utf-8");

console.log(`本地调试:http://${hostname}:${port}`);

var server = http.createServer(function(req, res) {
    res.writeHead(200);
    res.end(index_context);
});

server.listen(port);

这里会将web/index.html文件展示在页面上。绑定在本地的8080端口。

在局域网下玩耍

现在你有了一个用node.js写的小型服务器了,并且可以运行展示一个页面。那么接下来你就可以将这个页面展示给小伙伴了。你可以在局域网下展示给他们,方法是让你的小伙伴和你共同连接一个局域网(你可以分享你电脑的无线网,或者直接都连接你的手机热点),然后将服务器的监听端口改变成你的无线网IP就行了。

在Mac系统下,你可以这样查看你的无线网IP:

Mac下查看热点IP地址

然后改写node.js中的这一行:

1
2
const hostname = '你的手机热点IP';
const port = 8080;

之后你的小伙伴输入你的手机热点IP就可以看到你的网页啦。

将网站放到公网上

如果你的小伙伴和你不在一个局域网下,那么就没办法看到你的网站了。这个时候就要使用网络穿透的手段将自己的电脑穿透到公网上去。

ngrok

最著名的网络穿透工具是ngrok,官网在这里,你只要进去下载它们的工具,并且注册一个账号就可以使用了。使用的方法很简单,官网教程也说的很清楚教程

如果你想要使用http协议,那么你就写

1
ngrok http port

port是你本地的端口号(比如上面的程序就是8080)

如果是tcp协议你就吧http换成tcp就行了。

虽然说这个很有名,但是我的电脑运行之后网站登不上去啊,不知道是不是被墙了。如果你和我一样,那可以看看下面这个。

natapp

natapp是我们国内的,基于ngrok的网络穿透工具。官网在这里。 进去之后和ngrok一样,下载他们的命令行程序,注册一个账号,创建一个网络隧道即可。网上也有很多教程,这里就不赘述了。

natapp一个人可以免费创建两个网络隧道,我就创建了一个http类型的一个tcp类型的。

当你准备好之后,首先在本地把你的nodejs写的服务器转起来,然后再使用natapp指定你的端口号转起来就行了:

natapp内网穿透

这里我点击 http://2psa8j.natappfree.cc 就可以访问我的网站了。

需要注意的是,ngrok和natapp每次打开的时候的域名都是随机的。如果你想要绑定域名的话,ngrok是可以直接绑定的,但是natapp需要付费

http类型的隧道只能展示网页,如果你想要做服务器游戏的话需要tcp类型的隧道,并且还需要一个客户端程序和一个服务器程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#file: client.py
#-*- coding:UTF-8 -*-
#!/usr/bin/python3
import socket

if __name__ == '__main__':
    sock = socket.socket()
    host = socket.gethostname()
    sock.connect(('server.natappfree.cc', 32775))
    while True:
        context = sock.recv(1024)
        if context:
            print(context.decode('utf-8'))
            break
    sock.close()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#file: server.py
#-*- coding:UTF-8 -*-
#!/usr/bin/python3
import socket
import threading

def server_func(c, addr):
    c.settimeout(5)
    print("connect address:", addr)
    text = 'I recieved your require'.encode('utf-8')
    c.send(text)
    c.close()

if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('localhost', 5050))
    sock.listen(10)
    print("server is running...")
    while True:
        try:
            c, addr = sock.accept()
            if c and addr:
                t = threading.Thread(target=server_func, args=[c, addr])
                t.start()
                t.join()
        except socket.timeout:
            print("time out")
        except:
            break
    sock.close()
    print("server closed")

这里客户端一连接,服务器就会打印出客户端的信息,并且返回一个"I recieved your require"。

这里首先得运行natapp,使用你的tcp隧道的authtoken来转,这样就会自动切换到tcp隧道方式:

1
natapp -authtoken=你的TCP隧道authtoken

然后屏幕上会显示tcp的地址:

natappTCP地址

这个时候再将你的客户端程序的连接和端口号改成这个:

1
sock.connect(('server.natappfree.cc', 40798)) #client.py

注意服务器程序不要更改。

然后运行你的服务器程序,现在你的服务器程序就对应了这个域名了。

然后再运行你的客户端程序,可以看到来自服务器的响应:

natappTCP穿透结果

这样的话学期末的时候就可以编写服务器游戏啦,到时候如果写出来了Demo我会把源码放在我的github上的。

免费域名

最后再给两个免费域名的资源,你可以在这个网站上申请免费的域名: gearhost这个可以终身使用,但是你的域名后面会有gearhost.xxx的后缀。 freenom这个最长可以免费使用12个月,但是没有自带的后缀。

参考

廖雪峰的node.js教程 ngrok内网穿透教程

updatedupdated2023-06-182023-06-18