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');
});
Related
I created node js https server by nodejs.
var express = require('express');
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('privatekey.pem'),
cert: fs.readFileSync('certificate.pem')
};
var app = express();
var server = https.createServer(options, app).listen(443,()=>{
console.log('listen to https');
});
var io = require('socket.io').listen(server);
io.on('connection', function (socket) {
console.log(' user connected');
socket.on('disconnect', function () {
console.log('a user disconnected');
});
});
after start server, when i want to connect to server by socket.io client tools like : https:///172.16.130.3:443 i got :
Connection to https:///172.16.130.3:443 timed out!
Im setting up a chat server with socket.io. I followed their tutorial til it came to SSL. I found some explainations here on stack and tutorials in the net, so i came up with the following code.
I replaced my real domain with "my-domain.de"
var app = require('express')();
var fs = require('fs');
var https = require('https');
var io = require('socket.io')(https);
var mysql = require('mysql');
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/cert.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/chain.pem')
};
var serverPort = 8443;
var server = https.createServer(options, app);
server.listen(serverPort, function(){
console.log('listening on *:' + serverPort);
});
io.on('connection', function(socket){
console.log('a user connected');
});
The Server runs, but the Client doesnt recieve the socket.io.js. So i started the server with DEBUG=* -node index.js to see whats happening. It shows the following Error when a client tried to connect:
express:application no routes defined on app +9s
finalhandler default 404 +0ms
The Client looks like this:
<script src="https://my-domain.de:8443/socket.io/socket.io.js"></script>
<script>
$(function () {
var socket = io('https://my-domain.de:8443/');
</script>
After hours of headache i found the solution and it is as simple as always...
I simply had to place var io = require('socket.io')(server); after var server = https.createServer(options, app); So that it can route correctly...
So that my final server code looks like this:
var app = require('express')();
var fs = require('fs');
var https = require('https');
var mysql = require('mysql');
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/cert.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/my-domain.de/chain.pem')
};
var serverPort = 8443;
var server = https.createServer(options, app);
var io = require('socket.io')(server); // HERE TO PUT THE DAMN SOCKET.IO!!
server.listen(serverPort, function(){
console.log('listening on *:' + serverPort);
});
io.on('connection', function(socket){
console.log('a user connected');
});
This is the code that was provided in the example:
'use strict';
var server = require('./app');
var port = process.env.PORT || process.env.VCAP_APP_PORT || 3000;
server.listen(port, function() {
console.log('Server running on port: %d', port);
});
But when using https instead of server it is not working well with IBM Watson conversation code.
The below is the code I used:
var https = require('https');
var fs = require('fs');
var server = require('./app');
var port = process.env.PORT || process.env.VCAP_APP_PORT || 3000;
var options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
var a = https.createServer(options, function (req, res) {
server.listen(port, function() {
console.log('Server running on port: %d', port);
});
}).listen(port);
In the case, Express API doc spells this out pretty clearly.
And this article can help too.
You can create a HTTPS in node.js with:
var express = require('express'); //express for it
var server = require('./app');
var https = require('https');
var http = require('http');
var fs = require('fs');
var port = process.env.PORT || process.env.VCAP_APP_PORT || 443; //example
// from the Node.js HTTPS documentation, almost the same your code.
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};
// Create a service (the app object is just a callback).
var app = express();
// Create an HTTP service.
http.createServer(app).listen(80); //you can put the port too.
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(port);
The Express documentation show this:
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
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');
});