using socket.io in conjunction with express - node.js

I am trying to sent a basic message when users connect and disconnect. Later i want to sent parameters back and forth. But with the following code i do not get the messages print out on the server when they connect/disconnect.
When i replace io.on with server.on i can get the message 'User connected' but not user disconnected when i refresh/close the page. This however is buggy, since not everytime i refresh it logs the message and on first time it sometimes log the message multiple times.
server.js
var //io = require('socket.io'),
http = require('http'),
express = require('express');
var PORT = process.env.PORT || 8080,
HOST = process.env.HOST || 'localhost';
var app = express();
app.use(express.static(__dirname + '/views'));
app.get('/', function (req, res) {
res.sendfile(__dirname + 'index.html');
});
server = http.Server(app);
//io = io.listen(server);
var io = require('socket.io')(server);
io.on('connection', function(socket){
console.log('User connected');
io.on('disconnect', function(socket) {
console.log('User Disconnected');
});
});
server.listen(PORT, HOST, null, function() {
console.log('Server listening on port %d in %s mode', this.address().port, app.settings.env);
});
New code:
var express = require('express'),
app = express(),
http = require('http'),
server = http.createServer(app),
io = require('socket.io').listen(server);
var PORT = process.env.PORT || 8080,
HOST = process.env.HOST || 'localhost';
server.listen(PORT);
app.use(express.static(__dirname + '/views')); //need this for my directory structure.
app.get('/', function (req, res) {
res.sendfile(__dirname + 'index.html');
}); //Need this to call my page.
io.on('connection', function( client ){
console.log('Connected');//this does not work.
io.on('disconnect', function( client) {
console.log(client);
});
});

Try reconfiguring your socket, and server instantiation:
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
server.listen(process.env.PORT || 3000);
io.on('connection', function( client ) {
console.log(client) //this will now work
client.on('disconnect', function( id ) {
console.log('user with ID ' + id + ' has disconnected');
});
});

First of all you need to be sure if you have included the client side socket.io files.
<script src="/socket.io/socket.io.js"></script>
Then you need to initialize the socket connection.
<script>
var socket = io();
</script>
The above changes will be in your index.html file.
Now in server.js file,
io.sockets.on('connection', function(socket) {
console.log("User connected");
socket.on('disconnect', function() {
console.log('Got disconnect!');
});
});

Related

how to pass a param to socket chat client through browser url

I just created a small socket.io chat and my server code is like
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 3000;
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
socket.broadcast.emit('Welcome to Dobuyme');
});
http.listen(port, function(){
console.log('listening on *:' + port);
});
An my client side in the index.html is
$(function () {
var socket = io();
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
window.scrollTo(0, document.body.scrollHeight);
});
});
Now i can connect the chat server through the url
http://localhost:3000/
Now i want to integrate this module with my program, for that i need to pass a user id to this url.i just did something like
http://localhost:3000/index.html?id=2
But i cant pass the id.How can pass an id variable to node server through the url

Server to Server with Socket.io

I have two EC2 instances, and I am using socket.io to establish communication between them.
In my First Server I have the following files
server1.js
........
........
var loadData = require("./client/getData");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use('/', loadData);
var port = Number(process.env.PORT || 5000);
app.listen(port);
var server = require("https").Server(app);
var io = require("socket.io-client");
app.set('socketio', io);
..........
getData.js
......
router.get('/getMetaData', function(req, res){
var io = req.app.get('socketio');
var socket = io.connect('https://172.43.3.2:8080');
socket.on('metaData', function(data){
console.log("MetaData:", data);
res.json(data);
});
});
module.exports = router;
In my Second Server i have the following
server2.js
var express = require('express');
var app = express();
var server = require("https").Server(app);
var io = require("socket.io")(server);
app.get('/', function (req, res) {
res.send('Hello World');
});
var port = Number(process.env.PORT || 5000);
app.listen(port);
var metaData = {
"block1":["id1","id2"]
}
io.on('connection', function(socket){
console.log("Received Connection");
socket.emit('metaData', metaData);
});
console.log("Server Running on:", process.env.PORT);
My request to the route /getMetaData is resulting in "504 Gateway Time-out", I am not sure what I am doing wrong or missing out on

How to connect socket.io in ExpressJS

Good morning why this code don't work (server respond but "io.on" no):
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
//this code not work in console // even it can not see
io.on('connection', function(socket) {
console.log('a user connect');
socket.on('disconnect', function() {
console.log('a user disconnect');
});
});
//server respond
http.listen(3000, function() {
console.log('Server running at 3000');
});
I'm a beginner, express and socket.io i downloaded by npm
You need to have a server as well as a client which will make a connection to the socket io server.
Based on what I understood from your code, I guess you want to do something like this:
First your server.js:
#!/usr/bin/env node
var http = require('http');
var express = require('express');
var app = express();
var io = require('socket.io');
var port = 3000;
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
var socketio = io.listen(server);
setInterval(function() {
console.log("Emitting..");
socketio.emit('data', {"x":"123"});
}, 2000);
module.exports = app;
Then your client.html: (I am writing a client, which will log into browser console.)
<html>
<head></head>
<body>
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script>
var socket = io.connect("http://localhost:3000/");
socket.on('connect', function() {
console.log('connected');
});
socket.on('disconnect', function(){
console.log('disconnected');
});
socket.on("data", function(data) {
console.log(data);
});
</script>
</body>
That's it. Now start your server with node server.js and then, open up client.html in your browser and check console. Let me know, if there's anything unclear.

Socket.io not working with Heroku

I have looked at all of the Stack Overflow questions regarding the problem. Still, I am unable to run Socket IO along with Heroku. I have looked at https://github.com/socketio/socket.io/issues/1542 and this https://github.com/nodejs/node-v0.x-archive/wiki/Socket.IO-and-Heroku. The sockets run locally.
index.js
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 8080;
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket){
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
var server = http.listen(port, function(){
});
The running sample is here. https://curly-octo-woof.herokuapp.com/

express, socket.io server for browser client and node.js client

I am trying to set-up an express server with socket.io that will allow node.js clients and browser clients to connect. The browser connects with no problem. The node.js client using socket.io-client give an error:
unhandled socket.io url
Server:
var express = require('express'),
io = require('socket.io');
var app = express();
var host = 'localhost';
var port = process.env.PORT || 8080;
var server = app.listen(port, function() {
console.log('Gulp is starting my app on PORT: ' + port)
});
io = io.listen(server);
app.use('/', express.static(__dirname + '/'));
io.on("connection", function(socket) {
socket.on('clientMessage', function(jsonData, from) {
socket.emit('serverMessage', 'Got a message!');
console.log('Data being sent from', from, 'is:\n' + jsonData);
});
});
Client:
var io = require('socket.io-client')
var socket = io.connect('http://192.168.1.222:8080', {reconnect: true});
socket.emit('clientMessage', 'Hello', 'Pi-Voyager');
The issue was with the way I was requiring my dependencies. It worked on other versions but on my current version it did not.
node -v
v0.12.4
"express": "^4.13.1",
"socket.io": "^1.3.6",
"socket.io-client": "^1.3.6"
With these versions, the following code works:
Server
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 8080;
server.listen(port, function() {
console.log('Gulp is starting my app on PORT: ' + port)
});
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
io.on("connection", function(socket) {
socket.on('clientMessage', function(jsonData, from) {
socket.emit('serverMessage', 'Got a message!');
console.log('Data being sent from', from, 'is:\n' + jsonData);
});
});
Client
var io = require('socket.io-client')
var socket = io.connect('http://10.1.0.47:8080', {reconnect: true});
socket.emit('clientMessage', 'Hello', 'Pi-Voyager');

Resources