2015-01-23 3 views
1

Попытка создания теста эхо-сервера как с клиентом, так и с сервером в том же процессе узла. Этот код работает, если я разбил его на 2 файла (сервер и клиент), но он не работает, если он объединен в 1 файл. Как я могу заставить его работать внутри 1 файла?клиент и сервер в том же процессе nodejs

var HOST, createServer, g, net; 

net = require("net"); 

HOST = "127.0.0.1"; 

createServer = function(port) { 
    net.createServer(function(sock) { 
    sock.write("welcome! on port " + port + "\r\n"); 
    console.log("CONNECTED: " + sock.remoteAddress + ":" + sock.remotePort); 
    while (true) { 
     sock.write("hello\r\n"); 
    } 
    }).listen(port, HOST); 
    console.log("server listening on " + port); 
}; 

createServer(7001); 

g = net.createConnection(7001, HOST); 

g.on("data", function(data) { 
    console.log("got " + data); 
}); 

и то же самое в CoffeeScript:

net = require "net" 
HOST = "127.0.0.1" 

createServer = (port) -> 
    net.createServer((sock) -> 
    sock.write("welcome! on port #{port}\r\n") 
    console.log("CONNECTED: #{sock.remoteAddress}:#{sock.remotePort}") 
    while true # this is the work queue, what ports to send to...     
     sock.write "hello\r\n" 
    return 
).listen port, HOST 
    console.log "server listening on #{port}" 
    return 

createServer(7001) 

# XXX why does g.on "data" never fire?           
# this works fine if I move it into            
# it's own file, how to co-exist             
# this client with server above             
# in same file?                 
g = net.createConnection(7001, HOST) 
g.on "data", (data) -> 
    console.log "got #{data}" 
    return 

ответ

1
while (true) { 
    sock.write("hello\r\n"); 
} 

Это ваша проблема. Вы пишете на поток бесконечно; и если это никогда не закончится, это не вызовет ваше событие «данных». Для того, чтобы проиллюстрировать более ясно, попробуйте это (вместо кода выше):

while (true) { 
    console.log("hello!"); 
    sock.write("hello\r\n"); 
} 

Или:

var i = 0; 
while (i < 5) { 
    i++; 
    sock.write("hello\r\n"); 
} 

EDIT: Чтобы сохранить эхо на неопределенный срок, может быть, попробовать что-то вроде этого:

net.createServer(function(sock) { 
    sock.write("welcome! on port " + port + "\r\n"); 
    console.log("CONNECTED: " + sock.remoteAddress + ":" + sock.remotePort); 
    setInterval(function() { 
    sock.write("hello\r\n"); 
    }, 2000); 
}).listen(port, HOST); 
+0

Спасибо, бардзусный! Я использовал SetInterval с задержкой «0», и теперь данные перекачиваются! – joe

Смежные вопросы