Если html-страница на https, то в целях безопасности загрузка (включая сокеты) с http запрещена.
Надо, чтобы сокет-сервер работал тоже на https. Например, так:
if (fs.existsSync('ssl/cert.key') && fs.existsSync('ssl/cert.crt')) {
options = {
key: fs.readFileSync('ssl/cert.key'),
cert: fs.readFileSync('ssl/cert.crt')
};
server = require('https').Server(options, express);
} else {
server = require('http').Server(express);
}
io = require('socket.io').listen(server);
А уж будет он напрямую или через CloudFlare - значения не имеет.