Javascript 使用节点js和套接字io处理响应
我有一个场景,其中web页面最初由HTTP提供服务。单击submit按钮后,它将向服务器发送一些数据,并执行一些web服务,这将花费很长时间。我需要快速显示响应页面,在web服务作业完成后,必须在先前加载的相同页面中显示结果 这可以通过http处理程序处理所有请求,然后通过套接字io传递结果来实现 我希望写一些类似的代码Javascript 使用节点js和套接字io处理响应,javascript,node.js,websocket,dom-events,Javascript,Node.js,Websocket,Dom Events,我有一个场景,其中web页面最初由HTTP提供服务。单击submit按钮后,它将向服务器发送一些数据,并执行一些web服务,这将花费很长时间。我需要快速显示响应页面,在web服务作业完成后,必须在先前加载的相同页面中显示结果 这可以通过http处理程序处理所有请求,然后通过套接字io传递结果来实现 我希望写一些类似的代码 var httpd = require('http').createServer(handler); var io = require('socket.io').listen(
var httpd = require('http').createServer(handler);
var io = require('socket.io').listen(httpd);
var fs = require('fs');
httpd.listen(4000);
function handler(req, res) {
fs.readFile(__dirname + '/index.html',
function(err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
}
);
}
io.sockets.on('connection', function (socket) {
socket.on('clientMessage', function(content) {
setTimeout(function () {
socket.emit('serverMessage', "web service complete");
}, 5000);
});
});
对。只要看一个例子就知道如何使用它。是的。只要看一个例子就知道如何使用它。我找到了解决问题的方法,所以我把这个作为我自己问题的答案。我参考了socket.io聊天应用程序,它很有用,但没有完整的文档。对于某些函数,我们需要浏览源代码。 我使用了一个会话来识别套接字和http请求以及每个客户机。我将粘贴我找到的代码将工作
var io = require('socket.io');
var express = require('express');
var http = require('http');
var fs = require('fs');
var connect = require('connect');
var cookie = require("cookie");
var app = express();
var server = http.createServer(app)
var parseCookie = connect.utils.parseCookie;
var parseSignedCookie = connect.utils.parseSignedCookie;
var MemoryStore = connect.session.MemoryStore;
var sessionStore = new MemoryStore();
app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser('somesuperspecialsecrethere'));
app.use(express.session({
key: 'express.sid',
store: sessionStore
}));
});
app.get('/', function(req, res){
fs.readFile(__dirname + '/index.html',
function(err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
console.log("SessionID from http: "+req.sessionID);
setTimeout(function () { //this is for simulating a time taking task
var sock_id = io.sockets.sockets[req.sessionID];
io.sockets.sockets[sock_id].emit("getmessage","my mmmmmmmmmmmmmessssssage");
}, 5000);
});
});
GLOBAL.sio = io.listen(server);
server.listen(3000);
sio.sockets.on('connection', function (socket) {
var hs = socket.handshake;
socket.on('clientMessage', function(data) {
console.log("Message from client: "+ data.message);
io.sockets.sockets[hs.sessionID] = socket.id;
});
});
sio.set('authorization', function (data, accept) {
if (!data.headers.cookie) {
return accept('Session cookie required.', false);
}
data.cookie = cookie.parse(data.headers.cookie);
data.cookie = parseSignedCookie(data.cookie['express.sid'], 'somesuperspecialsecrethere');
data.sessionID = data.cookie;
console.log('Session Id from socket: ' + data.sessionID);
sessionStore.get(data.sessionID, function(err, session){
if (err) {
return accept('Error in session store.', false);
} else if (!session) {
return accept('Session not found.', false);
}
// success! we're authenticated with a known session.
data.session = session;
return accept(null, true);
});
<html>
<head>
<title>express WebSocket chat</title>
<script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'></script>
</head>
<body>
<script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
<script type="text/javascript">
var sio = io.connect('http://10.3.0.52:3000');
sio.socket.on('error', function (reason){
console.error('Unable to connect Socket.IO', reason);
});
sio.on('connect', function (){
console.info('successfully established a working connection ');
});
sio.on('getmessage', function(data) {
console.log(data);
});
</script>
<input type="text" name="message" id="message">
<input type="button" name="send" id="send" value="Send">
</body>
</html>
var io=require('socket.io');
var express=需要(“express”);
var http=require('http');
var fs=需要('fs');
var connect=require('connect');
var cookie=要求(“cookie”);
var-app=express();
var server=http.createServer(应用程序)
var parseCookie=connect.utils.parseCookie;
var parseSignedCookie=connect.utils.parseSignedCookie;
var MemoryStore=connect.session.MemoryStore;
var sessionStore=newmemorystore();
app.configure(函数(){
app.use(express.bodyParser());
app.use(express.cookieParser('somesuperspecialsecrethere');
应用程序使用(express.session)({
键:“express.sid”,
商店:sessionStore
}));
});
app.get('/',函数(req,res){
fs.readFile(uu dirname+'/index.html',,
功能(错误、数据){
如果(错误){
书面记录(500);
返回res.end('Error loading index.html');
}
书面记录(200);
res.end(数据);
log(“来自http的SessionID:+req.SessionID”);
setTimeout(函数(){//用于模拟耗时任务
var sock_id=io.sockets.sockets[req.sessionID];
io.sockets.sockets[sock_id].emit(“getmessage”、“my mmmmmmm EsssMessage”);
}, 5000);
});
});
GLOBAL.sio=io.listen(服务器);
听(3000);
sio.sockets.on('连接',功能(插座){
var hs=套接字。握手;
socket.on('clientMessage',函数(数据){
日志(“来自客户端的消息:+data.Message”);
io.sockets.sockets[hs.sessionID]=socket.id;
});
});
sio.set(“授权”,功能(数据,接受){
if(!data.headers.cookie){
return accept('需要会话cookie',false);
}
data.cookie=cookie.parse(data.headers.cookie);
data.cookie=parseSignedCookie(data.cookie['express.sid'],'somesuperspecialsecrethere');
data.sessionID=data.cookie;
log('来自套接字的会话Id:'+data.sessionID);
获取(data.sessionID,函数(err,session){
如果(错误){
返回accept('会话存储中有错误',false);
}else if(!会话){
返回accept('找不到会话',false);
}
//成功!我们已通过已知会话的身份验证。
data.session=会话;
返回接受(null,true);
});
快速网络聊天
var sio=io.connect('http://10.3.0.52:3000');
sio.socket.on('error',函数(原因){
console.error('无法连接Socket.IO',原因);
});
sio.on('connect',函数(){
console.info('成功建立了工作连接');
});
sio.on('getmessage',函数(数据){
控制台日志(数据);
});
我找到了问题的解决方案,因此我将此作为我自己问题的答案。我参考了socket.io聊天应用程序,它很有用,但没有完整的文档。对于某些功能,我们需要查看源代码。
我使用了一个会话来识别套接字和http请求以及每个客户端。我将粘贴我找到的代码
var io = require('socket.io');
var express = require('express');
var http = require('http');
var fs = require('fs');
var connect = require('connect');
var cookie = require("cookie");
var app = express();
var server = http.createServer(app)
var parseCookie = connect.utils.parseCookie;
var parseSignedCookie = connect.utils.parseSignedCookie;
var MemoryStore = connect.session.MemoryStore;
var sessionStore = new MemoryStore();
app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser('somesuperspecialsecrethere'));
app.use(express.session({
key: 'express.sid',
store: sessionStore
}));
});
app.get('/', function(req, res){
fs.readFile(__dirname + '/index.html',
function(err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
console.log("SessionID from http: "+req.sessionID);
setTimeout(function () { //this is for simulating a time taking task
var sock_id = io.sockets.sockets[req.sessionID];
io.sockets.sockets[sock_id].emit("getmessage","my mmmmmmmmmmmmmessssssage");
}, 5000);
});
});
GLOBAL.sio = io.listen(server);
server.listen(3000);
sio.sockets.on('connection', function (socket) {
var hs = socket.handshake;
socket.on('clientMessage', function(data) {
console.log("Message from client: "+ data.message);
io.sockets.sockets[hs.sessionID] = socket.id;
});
});
sio.set('authorization', function (data, accept) {
if (!data.headers.cookie) {
return accept('Session cookie required.', false);
}
data.cookie = cookie.parse(data.headers.cookie);
data.cookie = parseSignedCookie(data.cookie['express.sid'], 'somesuperspecialsecrethere');
data.sessionID = data.cookie;
console.log('Session Id from socket: ' + data.sessionID);
sessionStore.get(data.sessionID, function(err, session){
if (err) {
return accept('Error in session store.', false);
} else if (!session) {
return accept('Session not found.', false);
}
// success! we're authenticated with a known session.
data.session = session;
return accept(null, true);
});
<html>
<head>
<title>express WebSocket chat</title>
<script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'></script>
</head>
<body>
<script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
<script type="text/javascript">
var sio = io.connect('http://10.3.0.52:3000');
sio.socket.on('error', function (reason){
console.error('Unable to connect Socket.IO', reason);
});
sio.on('connect', function (){
console.info('successfully established a working connection ');
});
sio.on('getmessage', function(data) {
console.log(data);
});
</script>
<input type="text" name="message" id="message">
<input type="button" name="send" id="send" value="Send">
</body>
</html>
var io=require('socket.io');
var express=需要(“express”);
var http=require('http');
var fs=需要('fs');
var connect=require('connect');
var cookie=要求(“cookie”);
var-app=express();
var server=http.createServer(应用程序)
var parseCookie=connect.utils.parseCookie;
var parseSignedCookie=connect.utils.parseSignedCookie;
var MemoryStore=connect.session.MemoryStore;
var sessionStore=newmemorystore();
app.configure(函数(){
app.use(express.bodyParser());
app.use(express.cookieParser('somesuperspecialsecrethere');
应用程序使用(express.session)({
键:“express.sid”,
商店:sessionStore
}));
});
app.get('/',函数(req,res){
fs.readFile(uu dirname+'/index.html',,
功能(错误、数据){
如果(错误){
书面记录(500);
返回res.end('Error loading index.html');
}
书面记录(200);
res.end(数据);
log(“来自http的SessionID:+req.SessionID”);
setTimeout(函数(){//用于模拟耗时任务
var sock_id=io.sockets.sockets[req.sessionID];
io.sockets.sockets[sock_id].emit(“getm