思路是这样:首先客户端通过提交表单发送一条信息给服务端,然后服务端再广播给除发送信息的所有客户端。
好,先从服务器开始:
var http=require('http');
var fs=require('fs');
var server=http.createServer(function(req,res){
fs.readFile('./index.html',function(error,data){
res.writeHead(200,{'Content-Type':'text/html'});
res.end(data,'utf-8');
});
}).listen(3000,"127.0.0.1");
console.log("server running at http://127.0.0.1:3000");
var socket=require('socket.io').listen(server);
socket.sockets.on('connection',function(socket){
socket.on('message',function(data){
socket.broadcast.emit('push message',data);
});
});
客户端的需求有:
1)提交表单给服务器
2)监听推送事件
3)捕捉数据
4)将数据写入页面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>socket.io.example</title>
</head>
<body>
<h1>socket.test<h1>
<form id="messageId" action="#">
<textarea id="message" rows="4" cols="3"></textarea>
<input type="submit" value="send message"></input>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket=io.connect('http://127.0.0.1:3000');
var message=document.getElementById('message');
$(messageId).submit(function(){
socket.emit('message',{text:message.value});
return false;
});
socket.on('push message',function(data){
$('form').after('<p>'+data.text+'<p>');
});
</script>
</body>
</html>
package.json
{
"name":"socket-test",
"version":"0.1.0",
"private":"true",
"dependencies":{"socket.io":"0.8.7"}
}
哈哈,代码上完了。调试过程中有点疑问:为什么发送信息给服务器的客户端收不到服务器的广播信息呢?服务器广播信息使用的是broadcast.emit()方法,之前的实例使用broadcast.emit()方法的时候,测试时所有的客户端都可以收的到信息的。哈哈,不科学啊。之后问了在社区里面交流。得知这是nodejs的一种内置机制。说服务器知道是哪个客户端发送过来的信息,所以没有广播给相应的客户端了。哈哈,看完这答复,直接跪了。那么强悍。现在也只能这样纸说了。