I'm trying to create a websocket client-server app where client and server will run on two different instances.
Setup
- Server/Back-end: running on
localhost:9006
with angular-fullstack generator including socket.io - Client/Front-end: running on
localhost:9007
with angular generator +socket.io-client
+ btford.socket-io (a AngularJS socket.io bridge)
Server
Note: not complete code, but the pieces I think are relevant.
// ----- 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
// ----- 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');
});
Results
No console errors on server nor client, but it doesn't work and the server logs 100's of these lines:
GET /socket.io/?EIO=3&transport=polling&t=1421488528935-16027 200 2ms
...which looks like the client connects over HTTP but fails to switch over to websockets.
Any ideas?
Update
Here is the entire client/server project with instructions in README: https://github.com/weld-io/socket.io-client-server-boilerplate
The path is not defined correctly in server/app.js
Try to use '/socket.io' path like this:
Next, to choose websockets instead of long-polling, you can select the websocket transport in test-client/scripts/application.js
I think it's because your server are using sockets on http://localhost:9007 and your client on http://localhost:9006. Try to put both on the same port, it should work.
Could try 2 things: first change
to
Secondly on server side set
I know that looks incorrect, since you want to avoid polling, still it helped a lot of people who had the same problem.
I suggest you test client-server respectively. nc will be an ideal alternative for this kind of situation.
start server and
echo testserver | nc server_ip server_port
and check server log.start client and
netcat -l -p server_port
and check client log.BTW, the client code you've showed doesn't seem to attempt to connect to the server.