我正在尝试使用Socket。IO在最新的快速版本,但没有成功。我想使用插座。在特定的js文件中使用"router"而不是全局的"app.js"来实现IO功能。
另外,我希望服务器端与客户端是不同的页面。
下面是我的代码:
-
服务器端,一个名为"addPost.js"的文件,位于"routes"文件夹:
router.get('/', function(req, res, next) { io.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); }); res.render('addPost'); });
-
客户端,一个名为"index"的文件。"addPost.js"位于"views"文件夹中,它与"addPost.js"无关:
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script> var socket = io.connect('http://localhost:3000/'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script>
我如何在它们之间连接?
你需要让套接字监听服务器的端口。在addPost.js中:
function listenServer(){
io = require('socket.io').listen(server)
}
如果你不想在你的应用程序文件中这样做,你应该发送链接到你的服务器到套接字。在app.js中这样写:
var server = http.createServer(app);
server.listen(app.get('port'), function(){
log.info('Express server listening on port ' + app.get('port'));
});
var socket = require('addPost.js');
socket.listenServer(server);
您不需要放置io。在内部路由器
router.get('/', function(req, res, next) {
res.render('addPost');
// after you render the page
// client will connect to socket
// or if you want to send news along with this request do something like
getNews(function(err, news){
res.render('addPost', {news: news});
// obviously you need to render the news in your view
});
});
io.on('connection', function (socket) {
// now after the client has recieved page from res.render
// client will connect and can ask for news
socket.on('getNews', function () {
// your logic to get news
getNews(function(err, news){
if(!err) socket.emit('news', news);
});
});
socket.on('my other event', function (data) {
console.log(data);
});
});
客户端脚本
<script>
var socket = io.connect('http://localhost:3000/');
//ask for news
socket.emit('getNews');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
希望能有所帮助。