Nodejs 自己写的代码想公用 ,但是想在外面使用socket.io去listen 这个httpserver这块代码该怎么改呢?

Nodejs 自己写的代码想公用 ,但是想在外面使用socket.io去listen 这个httpserver这块代码该怎么改呢?

server.js

var http = require(“http”); var url = require(“url”); var fs = require(“fs”); function start(pages, port) { function onRequest(request, response) { fs.readFile(__dirname+"/"+pages,function(err,data){ if(err){ response.writeHead(500); } response.writeHead(200, { “Content-Type”: “text/html” }); response.end(data); }) } http.createServer(onRequest).listen(port) console.log(“Server has started.”); } exports.start = start;

app.js


var server = require("./server"); server.start(“index.html”, 8888); var io = require(“socket.io”).listen(server)


2 回复

要实现你的需求,即在 server.js 中创建一个 HTTP 服务器,并且允许外部的 app.js 使用 socket.io 来监听这个 HTTP 服务器,你需要对代码进行一些调整。以下是具体的修改步骤:

修改后的 server.js

首先,在 server.js 中创建一个 HTTP 服务器,并将其导出,以便外部文件可以使用它。

// server.js

var http = require('http');
var url = require('url');
var fs = require('fs');

function start(pages, port) {
    function onRequest(request, response) {
        fs.readFile(__dirname + "/" + pages, function (err, data) {
            if (err) {
                response.writeHead(500);
            } else {
                response.writeHead(200, {
                    'Content-Type': 'text/html'
                });
                response.end(data);
            }
        });
    }

    // 创建 HTTP 服务器并返回
    var server = http.createServer(onRequest);
    return server;
}

exports.start = start;

修改后的 app.js

app.js 中,导入 server.js 并启动 HTTP 服务器,然后使用 socket.io 监听这个服务器。

// app.js

var serverModule = require('./server');
var io = require('socket.io');

// 启动 HTTP 服务器
var server = serverModule.start("index.html", 8888);

// 使用 socket.io 监听这个服务器
io.listen(server);

console.log("Server is listening on port 8888 with socket.io");

// 可以在这里添加 socket.io 的事件处理逻辑
server.on('connection', function(socket) {
    console.log('A client connected!');
    socket.on('disconnect', function() {
        console.log('Client disconnected');
    });
});

解释

  1. server.js:

    • start 函数现在返回创建的 HTTP 服务器实例。
    • 通过 return server; 将服务器实例返回给调用者。
  2. app.js:

    • 引入 server.js 模块,并调用 start 方法来启动 HTTP 服务器。
    • 使用 io.listen(server);socket.io 绑定到这个 HTTP 服务器上。
    • 添加了简单的连接和断开事件处理逻辑作为示例。

这样,你就可以在 server.js 中创建 HTTP 服务器,并在 app.js 中使用 socket.io 来监听这个服务器。


在你的当前实现中,server.js 文件导出了一个 start 函数,用于创建并监听 HTTP 服务器。但是,你想在 app.js 中同时使用 HTTP 服务器和 Socket.IO。你需要将 HTTP 服务器的创建与 Socket.IO 的监听分开来处理。

示例代码

server.js

var http = require('http');
var url = require('url');
var fs = require('fs');

function start(pages, port, io) {
    function onRequest(request, response) {
        fs.readFile(__dirname + "/" + pages, function (err, data) {
            if (err) {
                response.writeHead(500);
            } else {
                response.writeHead(200, {
                    "Content-Type": "text/html"
                });
                response.end(data);
            }
        });
    }

    var server = http.createServer(onRequest);
    
    // 将 HTTP 服务器传给 Socket.IO
    io.attach(server);

    server.listen(port, () => {
        console.log(`Server has started on port ${port}`);
    });
}

exports.start = start;

app.js

var server = require("./server");
var io = require("socket.io")();

server.start("index.html", 8888, io);

// 可以在这里添加 Socket.IO 监听事件
io.on('connection', (socket) => {
    console.log('A user connected');
    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

解释

  1. server.js:

    • start 函数现在接受一个额外的参数 io,用于连接 HTTP 服务器到 Socket.IO
    • 使用 io.attach(server)Socket.IO 绑定到 HTTP 服务器上。
  2. app.js:

    • 创建 Socket.IO 实例并将其传递给 server.start 方法。
    • 在这里可以定义 Socket.IO 的事件监听器。

这样,你就可以在一个地方设置 HTTP 服务器,在另一个地方设置 Socket.IO,并将它们结合起来工作。

回到顶部