2017-02-20 35 views
1

嘿,我正在编写一个应用程序。我要求客户根据收到的消息输入特定的消息,我将数据从服务器发送回客户端。会发生什么情况是,当用户从客户端输入数据时,在响应来临之前客户端再次打印“输入消息”...我正在使用node.js的readline和net模块。这里是我的代码:在让客户端输入另一条消息之前等待服务器响应

var server = net.createServer( //My server side code which sends response. 
function(socket){ 
    console.log("Client connection..."); 


    socket.on('end', function(){ 
     console.log("Client disconnected..."); 

    }); 

    socket.on('data', function(data){ 
     console.log(" Received: ", data.toString()); 

     a=data.toString(); 

     if(a=="lookupByLastName Smith") //json data send if client sends this 
     { 
      arr= employees.lookupByLastName('Smith'); 
      socket.write("Data"+JSON.stringify(arr)); 
     } 




    }); 

    socket.write("Hello from server"); 
}); 

//客户端代码:

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

var readMessage = function(client) { 
     rl.question("Enter Message: ", function (line){ 
     client.write(line);//enter message appears twice before server res.      
     if (line == "bye") 
      client.end(); 
     else 
      readMessage(client); 
    }); 
}; 

var client = net.connect({port:3000}, 
    function(){ 
     console.log("Connected to server"); 
     readMessage(client); 
    }); 

client.on('end', function(){ 
    console.log("Client disconnected..."); 
    return; 
    }); 

    client.on('data', function(data){ 
    console.log("\n --Received:", data.toString()); 
}); 

Check the second message "Enter message" it shouldn't appear second time till server responds back。所以在解决它帮助需要。

回答

0

当从服务器收到数据时,您可以询问用户输入。

在下面的例子中,我还添加了一些超时服务器hello消息,并在服务器未响应客户端消息为4秒:

var readline = require('readline'); 
var net = require('net'); 

var port = 3000; 

var helloTimeout; 
var responseTimeout; 
var timeout = 4000; 

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

var readMessage = function(client) { 
    rl.question("Enter Message: ", function(line) { 
     client.write(line); //enter message appears twice before server res.      
     if (line == "bye") { 
      client.end(); 
     } else { 
      responseTimeout = setTimeout(function() { 
       console.log('not response from server for ' + timeout + "ms"); 
       client.emit("wait_for_input"); 
      }, timeout); 
     } 
    }); 
}; 

var client = net.connect({ port: port }, 
    function() { 
     console.log("Connected to server"); 
     helloTimeout = setTimeout(function() { 
      console.log('no hello received for ' + timeout + "ms, closing ..."); 
      client.end(); 
     }, timeout); 
    }); 

client.on('end', function() { 
    console.log("Client disconnected..."); 
    rl.close(); 
}); 

client.on('wait_for_input', function() { 
    readMessage(client); 
}); 

client.on('data', function(data) { 
    clearTimeout(helloTimeout); 
    clearTimeout(responseTimeout); 
    console.log("\n --Received:", data.toString()); 
    client.emit("wait_for_input"); 
}); 

我创建另一个事件client称为wait_for_input触发只有在数据来自服务器(在计算完此数据之后)以及客户端在用户输入某些命令后4秒内没有收到服务器的响应时

+0

那么您是否解决了超时或有问题任何其他方式。其次,服务器代码将保持与我发布的相同。我没有得到你的逻辑。 –

+0

忘记超时,仅在从服务器接收到数据后才要求用户输入。输入输入后,客户端将不会做任何事情,直到数据响应来自服务器等。 –

相关问题