编辑:我说的是每个在不同物理机器上的2个节点进程;
我不明白redis如何帮助我...
我知道Redis Cluster仍然不稳定,但是很久以来它已经通过了所有的单元测试,所以我开始使用它.
我想知道如果节点需要身份验证,Redis群集是否能正常工作.我倾向于认为是,因为它们通过不同的端口连接并使用不同的协议,但我不确定,也无法在规范中找到任何文档或任何内容来确认这一点.
此外,如果redis群集协议飞过身份验证障碍,那么它不是安全漏洞吗?我的数据库可以被外界访问吗?(该端口至少必须是可访问的,以便它可以与其他节点通信)
从我的理解在这里,"V8拥有世代垃圾收集器.移动对象随机风靡,节点不能得到一个指向原始字符串数据写入到插座." 所以我不应该将来自TCP流的数据存储在字符串中,特别是如果该字符串变得大于Math.pow(2,16)字节.(希望我到现在为止..)
那么处理来自TCP套接字的所有数据的最佳方法是什么?到目前为止,我一直试图_:_:_用作分隔符,因为我觉得它有点独特,不会乱搞其他东西.
将会出现的数据样本 something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data
这就是我试图做的事情:
net = require('net');
var server = net.createServer(function (socket) {
socket.on('connect',function() {
console.log('someone connected');
buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16
socket.on('data',function(data) {
if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived...
buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come.
} else …Run Code Online (Sandbox Code Playgroud) 我使用几行javascript来创建一个iframe元素,然后我想给它发一条消息,如下所示:
function loadiframe (callback) {
var body = document.getElementsByTagName('body')[0];
var iframe = document.createElement('iframe');
iframe.id = 'iframe';
iframe.seamless = 'seamless';
iframe.src = 'http://localhost:3000/iframe.html';
body.appendChild(iframe);
callback();
}
loadiframe(function() {
cpframe = document.getElementById('iframe').contentWindow;
cpframe.postMessage('please get this message','http://localhost:3000');
console.log('posted');
})
Run Code Online (Sandbox Code Playgroud)
然后,在http:// localhost:3000/iframe.html(iframe的源代码)里面是这样的:
<!DOCTYPE html>
<html>
<head>
<title>does not work</title>
<script>
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event) {
if (event.origin == "http://localhost:3000") {
document.write(JSON.stringify(event));
document.write(typeof event);
}
}
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但没有任何反应......我甚至试图不使用原产地的安全检查,但即使没有发生任何事情......就像从来没有得到消息......
我在某种异常问题吗?我试图确保在postMessage消失之前加载了iframe ...
EDIT1:此外,控制台上没有显示错误......
EDIT2:我在Google Chrome 11和Firefox 4中尝试过它
先感谢您.
从节点REPL的事情,
> 'function'.search('io\.')
5
Run Code Online (Sandbox Code Playgroud)
我真的需要它只匹配"io".而不是"功能"或中间只有"io"的东西......
更奇怪的事情:
> 'io'.search('io\.')
-1
> 'ion'.search('io\.')
0
Run Code Online (Sandbox Code Playgroud)
所以看来我没有逃脱点角色..?但我和"\"......对吗?我在http://www.regextester.com/和http://regexpal.com/上进行了测试,它的工作方式与我认为应该有效的方式相同.
我究竟做错了什么 ?node.js中的正则表达式与我习惯的有些不同吗?
EDIT1:在Google Chrome的javascript控制台中,我也得到了
'function'.search('io\.')
5
Run Code Online (Sandbox Code Playgroud)
所以这可能是一个v8的事情......对吗?
EDIT2:我从Firefox的javascript控制台得到了相同的结果,所以它不是v8的东西......这里发生了什么?我真的很困惑......
[如你所见,我不明白一个TCP服务器和客户端的基本概念非常好,大概socket.emit甚至是不可能的,但我想知道的最佳替代品或类似的事情...]
Socket.io有一个发送事件并在另一侧捕获它们的美妙事物,它在它的第一页(http://socket.io).我可以使用NodeJS的常规'net'模块做类似的事吗?如果不是那么相同的是什么?
我试过了:
server.js
var server = net.createServer(function(socket) {
socket.on("connect",function() {
socket.emit('test',{msg : 'did you get it ?'});
});
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
client.js
var client = net.createConnection(8000, localhost);
client.on('connect',function(){
client.on('test',function(data) {
console.log(data.toString());
});
});
Run Code Online (Sandbox Code Playgroud)
但是你可以想象,它不起作用.我怎样才能做到这一点?
提前致谢.
我在Ubuntu 11.04中运行Firefox 7,我注意到socket.io正在从网络套接字回退到xhr-polling,所以我输入WebSocket了Firefox的控制台,得到了
[00:48:21.224] ReferenceError: WebSocket is not defined
Run Code Online (Sandbox Code Playgroud)
在Google Chrome 14上我得到了
WebSocket
function WebSocket() { [native code] }
Run Code Online (Sandbox Code Playgroud)
根据这个,WebSockets的部分是由于火狐4支持和Firefox的自6全面支持.
它只是在linux上的firefox中有所不同吗?
我使用它作为样板,除了在同一个程序中我还有一些goroutine是工作者并连接到后端端点,tcp://127.0.0.1:5560.
我想要做的是让它通过更有效的方式连接,例如ipc://,inproc://,甚至是unix套接字.我试过那些,但它没有用.ZeroMQ的频道不合适吗?
那么如何在没有tcp的情况下将不同的goroutine与ZeroMQ上下文连接起来呢?还有更好的选择吗?
更新:代码:
// Simple message queuing broker
// Same as request-reply broker but using QUEUE device
//
// Author: Brendan Mc.
// Requires: http://github.com/alecthomas/gozmq
package main
import (
zmq "github.com/alecthomas/gozmq"
)
func startWorker() {
context, _ := zmq.NewContext()
defer context.Close()
worker, _ := context.NewSocket(zmq.REP)
//err := worker.Connect("ipc:///backend") // Tried it, but nothing
//err := worker.Connect("inproc:///backend") // Tried it, but nothing
err := worker.Connect("tcp://127.0.0.1:5560") // this works
if err != nil {
fmt.Println(err)
}
for { …Run Code Online (Sandbox Code Playgroud) 在一个简单的Go HTTP处理程序上,如果我在仍然写入响应时断开客户端,http.ResponseWritter.Write将返回一个错误消息,如write tcp 127.0.0.1:60702: connection reset by peer.
现在,从syscall包中,我有sysca.ECONNRESET,它有消息connection reset by peer,所以它们不完全一样.
我怎么能匹配它们,所以我知道如果发生这种情况不要恐慌?在我一直在做的其他场合
if err == syscall.EAGAIN {
/* handle error differently */
}
Run Code Online (Sandbox Code Playgroud)
例如,这工作正常,但我不能这样做syscall.ECONNRESET.
更新:
因为我迫切需要一个解决方案,暂时我会做这个非常肮脏的黑客攻击:
if strings.Contains(err.Error(), syscall.ECONNRESET.Error()) {
println("it's a connection reset by peer!")
return
}
Run Code Online (Sandbox Code Playgroud)