我正在尝试创建一个websocket客户端 – 服务器应用程序,其中客户端和服务器将在两个不同的实例上运行.
建立
>服务器/后端:在本地主机上运行:9006与angular-fullstack generator包括socket.io
>客户端/前端:在localhost上运行:9007 with angular generator socket.io-client btford.socket-io(AngularJS socket.io bridge)
服务器
注意:不完整的代码,但我认为是相关的.
- // ----- socketio.js -----
- // When the user connects.. perform this
- function onConnect(socket) {
- // When the client emits 'info',this listens and executes
- socket.on('info',function (data) {
- console.info('[%s] %s',socket.address,JSON.stringify(data,null,2));
- socket.emit('pong','OK!');
- });
- // Insert sockets below
- require('../api/thing/thing.socket').register(socket);
- }
- socketio.set('origins','http://localhost:9007');
- // ----- express.js -----
- app.use(function (req,res,next) {
- res.setHeader('Access-Control-Allow-Origin','http://localhost:9007');
- res.setHeader('Access-Control-Allow-Methods','GET,POST,OPTIONS,PUT,PATCH,DELETE');
- res.setHeader('Access-Control-Allow-Credentials',true);
- next();
- });
- // ----- app.js -----
- // Start server
- server.listen(config.port,config.ip,function () {
- console.log('Express server listening on %d,in %s mode',config.port,app.get('env'));
- });
客户
- // ----- client app.js
- angular
- .module('weldCommentsClientApp',[
- 'ngAnimate','ngAria','ngCookies','ngMessages','ngResource','ngRoute','ngSanitize','ngTouch','btford.socket-io'
- ])
- .factory('mySocket',function (socketFactory) {
- var myIoSocket = window.io.connect('http://localhost:9006');
- var mySocket = socketFactory({
- ioSocket: myIoSocket
- });
- mySocket.forward('pong');
- console.log('mySocket',mySocket);
- return mySocket;
- })
- // ----- client main.js
- angular.module('weldCommentsClientApp').controller('MainCtrl',function ($scope,mySocket) {
- $scope.$on('socket:pong',function (ev,data) {
- console.log('socket:pong',ev,data);
- });
- mySocket.emit('info');
- });
结果
服务器和客户端上没有控制台错误,但是它不起作用,服务器记录以下行的100个:
- GET /socket.io/?EIO=3&transport=polling&t=1421488528935-16027 200 2ms
…它看起来像客户端通过HTTP连接,但无法切换到websockets.
有任何想法吗?
更新
这是整个客户端/服务器项目,其中包含README:https://github.com/weld-io/socket.io-client-server-boilerplate中的说明
解决方法
服务器/ app.js中的路径未正确定义
尝试使用’/socket.io’路径,如下所示:
- var socketio = require('socket.io')(server,{
- serveClient: (config.env === 'production') ? false : true,path: '/socket.io'
- });
接下来,要选择websockets而不是长轮询,您可以在test-client / scripts / application.js中选择websocket传输
- var myIoSocket = window.io.connect('http://localhost:9006',{transports:['websocket']});