couldn't print the console message - node.js

I am using c9.io.
I am using node.js, socket.io and mongodb and here is my server code :
//
// # SimpleServer
//
// A simple chat server using Socket.IO, Express, and Async.
//
var http = require('http');
var path = require('path');
var async = require('async');
var socketio = require('socket.io');
var express = require('express');
var mongoClient = require("mongodb").MongoClient;
var port = process.env.PORT;
var ip = process.env.IP;
//
// ## SimpleServer `SimpleServer(obj)`
//
// Creates a new instance of SimpleServer with the following options:
// * `port` - The HTTP port to listen on. If `process.env.PORT` is set, _it overrides this value_.
//
var router = express();
var server = http.createServer(router);
var io = socketio.listen(server);
router.use(express.static(path.resolve(__dirname)));
server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
var addr = server.address();
console.log("Chat server listening at", addr.address + ":" + addr.port);
});
//mongoose connect
mongoClient.connect("mongodb://" + ip + ":" + 27017, function(err){
if(err) throw err;
//couldnt ENTER THIS FUNCTION!!
io.sockets.on('connection', function(socket){
console.log('DONE!');
socket.on('input', function(data){
console.log(data);
});
});
});
Everything works perfectly except in that couldn't enter io.sockets.on() function..
I wrote a comment before that function..
I have tried to print message before it in the console and it works perfectly..
Any help please

Related

Node server not responding to socket.io requests over HTTPS?

No idea why this is happening. The socket.io client is trying to connect on the front end:
from https://mywebsite.com:3000, But no response is being received from my node.js server:
var app = require('express')();
var cors = require('cors');
app.use(cors());
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('ioredis');
var Redis = new redis();
Redis.subscribe('live-updates');
Redis.on('message', function(channel, message) {
message = JSON.parse(message);
console.log(message);
io.emit(channel + ':' + message.event, message.data);
});
server.listen(3000, function() {
console.log('listening');
});
And the node server is running and listening successfully in the background using forever. Yet, there's no handshaking occurring. What's going on here?
Does the fact that I'm using SSL have something to do with this?
Edit
I have updated my node.js server configuration the the following, and am still stuck where I began.
var app = require('express')();
var cors = require('cors');
app.use(cors());
var https = require('https');
var fs = require('fs');
var io = require('socket.io')(https);
var redis = require('ioredis');
var Redis = new redis();
Redis.subscribe('live-updates');
Redis.on('message', function(channel, message) {
message = JSON.parse(message);
console.log(message);
io.emit(channel + ':' + message.event, message.data);
});
var options = {
key: fs.readFileSync('/etc/nginx/ssl/mysite.com/17710/server.key'),
cert: fs.readFileSync('/etc/nginx/ssl/mysite.com/17710/server.crt')
};
https.createServer(options, app).listen(3000, function() {
console.log('listening');
});

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');

socket io connecting but not emmiting

i have socket io redis and express pubsub going on, in my local host it works just fine i am using laravel events to publish to redis then socket io is supposed to emit the message, its working okay on local host but on my production server which is an ec2 vm it only gets to connect and i can see a console message 'connected' but it does not emit any events even though messages are being published to redis here is my client and server
//client
<script type="text/javascript">// <![CDATA[
var socket = io.connect('http://127.0.0.1:3000/');
socket.on('connect', function(data){
//socket.emit('subscribe', {channel:'score.update'});
console.log('connected');
});
socket.on('notification.update', function (data) {
//Do something with data
console.log('Notification Caught: ', data);
});
// ]]></script>
//server
var express = require('express'),
http = require('http'),
server = http.createServer(app);
var app = express();
const redis = require('redis');
const io = require('socket.io');
const client = redis.createClient();
server.listen(3000, 'localhost');
io.listen(server).on('connection', function(client) {
const redisClient = redis.createClient()
redisClient.subscribe('notification.update');
});
redisClient.on("message", function(channel, message) {
//Channel is e.g 'score.update'
client.emit(channel, message);
});
client.on('disconnect', function() {
redisClient.quit();
});
});
You need to change the listening of your server:
Change these:
var express = require('express'),
http = require('http'),
server = http.createServer(app);
var app = express();
const redis = require('redis');
const io = require('socket.io');
const client = redis.createClient();
And
server.listen(3000, 'localhost');
io.listen(server).on('connection', function(client){
//Code
});
To:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
And
io.on('connection, function(client){
//Code
});
server.listen(3000, function(){
console.log("Listening on :3000");
});

using socket.io in conjunction with express

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!');
});
});

Problems by setting up a encrypted Nodejs WebSocket-Server

I'm trying to get a nodejs wss-server up and running. For this I'm using the Express4 Framework and the eniaros/ws module.
But sadly I'm not able to get the WSS-Server up and running. The normal WS-Server is working quite fine, but every time I try to connect to my WSS the client gets connected and directly disconnected again.
My certs are self-signed.
My code is shown below. It would be awesome if some one could please help me!
var express = require('express');
var router = express.Router();
var app = express();
var http = require('http');
var https = require('https');
var WebSocket = require('ws').Server;
var path = require('path');
var fs = require('fs');
// Routes
app.use('/', require('./routes/index'));
// Load config files
var db_conf = require('./config/vops_db_config.json');
var server_conf = require('./config/vops_server_config.json');
// TLS-Files
var cert_basepath = './config/certs/';
var tls_key = fs.readFileSync(cert_basepath + server_conf.tls.key_path);
var tls_cert = fs.readFileSync(cert_basepath + server_conf.tls.cert_path);
var https_options = {
ssl: true,
port: 3030,
key : tls_key,
cert: tls_cert
};
// Start all HTTP-Servers
var httpServer = http.createServer(app);
var httpsServer = https.createServer(https_options, app);
httpServer.listen(3000, function () {
console.log('HTTP-Server now listening on port ' + 3000);
});
httpsServer.listen(3030, function(){
console.log('HTTPS-Server now listening on port '+ 3030);
});
// Start WebSocket-Server
var wss = new WebSocket( { server: httpServer });
wss.on('connection', function(ws) {
ws.on('message', function(message) {
console.log('received: %s', message);
});
ws.send('something');
});

Resources