使用Node.js和无需Express的方式进行Socket.io开发?

7

我想使用socket.io创建一个node.js服务器,但我是初学者,并且发现express包在语法上非常令人困惑。我知道我应该学习如何使用express和app.js,在我只使用http、js和socket.io这些包的情况下达到node.js的最大能力之后再做计划。我在网上搜了将近一个小时,没有找到解决我的问题的方法。我在socket.io方面遇到的主要问题是,在客户端上,函数io();不起作用。我甚至尝试将脚本链接路径重定向到我的服务器项目目录中的文件,但那只会返回一个错误,说明require();不是一个函数。我在这篇文章下面包含了一些我正在使用的文件(但并非所有文件)。如果格式有误或其他方面有误,请原谅我,因为这是我第一次使用stack exchange来提问。因此,如果您有足够的声望可以编辑它使其更适合在这里的格式,请编辑。

首先,我的服务器文件:

const http = require('http');
const fs = require('fs');
const io = require('socket.io')(http);

function socketReq(soc){
    soc.emit("test", {"user":"test", "text":"testing da socket"});
}

io.on("connection", socketReq);

function server(req,res){
    console.log('A user tried to connect to mazeserver.localtunnel.me'+req.url)
    if(req.url == '/'){
        console.log('Sending html...');
        res.writeHead(200, {"Context-Type":"text/html"});
        fs.createReadStream('./index.html').pipe(res);
    }else if(req.url == '/pong.js'){
        console.log('Sending JS...');
        res.writeHead(200, {"Context-Type":"text/JavaScript"});
        fs.createReadStream('./pong.js').pipe(res);
    }else {
        console.log('Error 404: file .'+req.url+' not found');
        res.writeHead(404, {"Context-Type":"text/html"});
        fs.createReadStream('./404.html').pipe(res);
    }
}

http.createServer(server).listen(1337);
console.log('Server created');

现在,我的主要HTML文件:

<html id='html'>
    <head>
        <title>Maze server</title>
        <center>
        <hr><br>
        <h1>Welcome to my test server!</h1>
        <br><hr>
        <p>This is some text to test</p>
        </center>
        <script type='text/JavaScript'>
            document.getElementById('html').style.hide = "true";
            document.onload = function(){
                document.getElementById('html').style.hide = "false";
            }
            var clicks = 0;
            function clickButton(){
                clicks++;
                document.getElementById('clicks').innerHTML = clicks;
            }
        </script>
    </head>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io();
    </script>
    <body>
        <center>
        <button onClick='clickButton();'>Im a button</button>
        <p>You've clicked me <span id='clicks'>0</span> times. Ouch!</p>
        <br><hr>
        <p>Test canvas:</p>
        <canvas id='canvas' width='400' height='200'></canvas>
        <script src='pong.js' type='text/JavaScript'></script>
        <br>
        <br>
        <button onClick='bounce();'>Bounce!</button>
        <br>
        <button onClick='speed("x");'>Speed up X</button>
        <button onClick='speed("y");'>Speed up Y</button>
        <br>
        <button onClick='speed("x"); speed("y");'>Speed up both</button>
        <br>
        <button onClick='resetXY();'>Reset</button>
        <br><hr>
        </center>
        <p>"Copyrite" <strong><blink type='EasterEgg' mazeiness='true'>MazeOfEncryption</blink></strong> 2048. Because why the heck not.</p>
    </body>
</html>

如果还需要更多文件,请告诉我应该包含哪些文件,尽管我认为问题可能在这两个文件中的一个中。提前感谢。
- Maze

你可以查看socket.io规范以找到方法。因为在连接到express后,它会添加几个路由来处理一些握手POST和GET请求。 - Hank Phung
所以基本上我需要添加一些东西才能使它在没有Express的情况下正常工作?你能更具体地说明吗? - Programah
在socket.io文档中,可以看到:http://socket.io/docs/#using-with-node-http-server。使用普通的http服务器和没有express的socket.io。或者甚至不需要创建自己的Web服务器:http://socket.io/docs/#using-it-just-as-a-cross-browser-websocket(socket.io会自己创建)。如果您需要处理除socket.io之外的URL,则Express实际上是最简单的选择。如果不需要,则可以使用带有socket.io的普通http服务器。 - jfriend00
1个回答

8

请确保您已通过npm安装了socket.io,并且已经获取了socket.io客户端。当然,您也可以使用CDN上的socket.io客户端:

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

对于服务器端,socket.io 应该引导 app 实例而不是 http。 例如:

var http = require('http');
var socket = require('socket.io');
function server()...
app = http.createServer(server);
io = socket(app);
app.listen(80);

默认情况下,它们使用端口80,因此在客户端中只需像这样指向本地主机var socket = io('http://localhost');。如果您想使用其他端口,则必须在io客户端实例化中进行更改。

var socket = io('http://localhost:1337')


谢谢!这个方法有效。我唯一还存在的问题是如何将端口从80改为1337,但我相信我能在网上找到这方面的信息。我需要这样做的原因是为了能够使用localtunnel.me来向其他人托管本地端口。似乎无法使用80端口,可能是由于权限错误。我可以尝试查找并解决这个问题,但如果知道为什么会有这个问题以及如何修复它的一个方法,那将会很有帮助。 - Programah
3
不知道为什么,io = socket() 不起作用,但是 socket = io() 却可以 :P。 - Programah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接