今年要学些计算机网络的知识了,打算学好之后自己做一个小的联机游戏。最好是可以让大家一起玩的。像我这种穷屌丝买不起服务器,只能在自己的电脑上搭建服务器咯。
首先可以使用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:
然后改写node.js中的这一行:
1
2
| const hostname = '你的手机热点IP';
const port = 8080;
|
之后你的小伙伴输入你的手机热点IP就可以看到你的网页啦。
如果你的小伙伴和你不在一个局域网下,那么就没办法看到你的网站了。这个时候就要使用网络穿透的手段将自己的电脑穿透到公网上去。
最著名的网络穿透工具是ngrok
,官网在这里,你只要进去下载它们的工具,并且注册一个账号就可以使用了。使用的方法很简单,官网教程也说的很清楚教程。
如果你想要使用http协议,那么你就写
port是你本地的端口号(比如上面的程序就是8080)
如果是tcp协议你就吧http换成tcp就行了。
虽然说这个很有名,但是我的电脑运行之后网站登不上去啊,不知道是不是被墙了。如果你和我一样,那可以看看下面这个。
natapp是我们国内的,基于ngrok的网络穿透工具。官网在这里。
进去之后和ngrok一样,下载他们的命令行程序,注册一个账号,创建一个网络隧道即可。网上也有很多教程,这里就不赘述了。
natapp一个人可以免费创建两个网络隧道,我就创建了一个http类型的一个tcp类型的。
当你准备好之后,首先在本地把你的nodejs写的服务器转起来,然后再使用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的地址:
这个时候再将你的客户端程序的连接和端口号改成这个:
1
| sock.connect(('server.natappfree.cc', 40798)) #client.py
|
注意服务器程序不要更改。
然后运行你的服务器程序,现在你的服务器程序就对应了这个域名了。
然后再运行你的客户端程序,可以看到来自服务器的响应:
这样的话学期末的时候就可以编写服务器游戏啦,到时候如果写出来了Demo我会把源码放在我的github上的。
最后再给两个免费域名的资源,你可以在这个网站上申请免费的域名:
gearhost这个可以终身使用,但是你的域名后面会有gearhost.xxx的后缀。
freenom这个最长可以免费使用12个月,但是没有自带的后缀。
廖雪峰的node.js教程
ngrok内网穿透教程