2017-03-08 74 views
0

我已经使用在Raspberry pi 3上运行的Node.js设置了TCP服务器。我使用Android客户端与服务器通信(来自[this] [1]教程的代码) 。只有当客户端连接到第一次连接时,我才会收到来自服务器的响应。Node.js - 写完后错误

当我尝试向它发出另一个请求时,请求被接收并处理,但在发送响应时,出现错误提示:write after end。

码(编辑):

var net = require('net'); 
var devList = []; 
var dev_msg; 

function serverCallback(socket){ 
    console.log("-----------------------------------------------------"); 

    socket.setNoDelay(true); 

    socket.on('data', function(data){ 
     var req = data.toString(); 

     console.log(req); 

     InitSystems(socket); 
    }); 

    socket.on('error', function(err){ 
     console.log(""+err); 
    }); 

    socket.on('end', function(){ 
     console.log("Write end"); 
    }); 
} 


function InitSystems(socket){ 
    socket.write("Message 1: Hi!"); 
    socket.end(); 

    //After 2nd request from client 
    socket.write("Message 2: Event has successfully taken place!"); //<-- Error here 
    socket.end(); 
} 

console.log("Server now running!"); 

var netServer = net.createServer(serverCallback); 
netServer.listen(6969); 

编辑: 的Android代码:

try{ 
      socket = new Socket("192.168.1.13", 6969); 

      socket.setSoTimeout(24 * 60 * 60 * 1000); 
      socket.setKeepAlive(true); 

      dOut = new DataOutputStream(socket.getOutputStream()); 

      dOut.writeUTF("INIT"); 
      dOut.flush(); 

      ba = new ByteArrayOutputStream(1024); 
      buffer = new byte[1024]; 

      int bytesRead; 
      is = socket.getInputStream(); 

      while((bytesRead = is.read(buffer)) != -1){ 
       ba.write(buffer, 0, bytesRead); 
       res += ba.toString("UTF-8"); 
      } 

      Log.d(TAG, res); 

      connStat = true; 
     }catch (UnknownHostException e) { 
      Log.d(TAG, e.toString()); 
     } catch(SocketException e){ 
      Log.d(TAG, e.toString()); 
     } catch (IOException e){ 
      try{ 
       Thread.sleep(2100); 
      }catch (Exception e1){ 

      }finally { 
       connStat = false; 
      } 
     } catch (Exception e) { 
      Log.d(TAG, e.toString()); 
     } 

提前感谢!

+0

有很多事情在那里。你能否将你的代码缩减到那个突破的部分?通常这会直接指出问题。另外,请格式化您的代码,使其易于阅读。你的代码编辑器应该为你做这个。如果没有,你可以使用[在线美化](http://jsbeautifier.org/)。 –

+0

你知道你有一个'setTimeout()',如果以前没有在套接字上遇到过一些情况,它会在3秒内关闭套接字? – jfriend00

+0

@ jfriend00我已经尝试过没有setTimeout(),但我仍然得到错误 – WhiplashOne

回答

0

这是你的问题(就像你评论):一个end()被称为

function InitSystems(socket){ 
    socket.write("Message 1: Hi!"); 
    socket.end(); 

    //After 2nd request from client 
    socket.write("Message 2: Event has successfully taken place!"); //<-- Error here 
    socket.end(); 
} 

你正在做一个后write(),它不允许你这样做。您可以将套接字视为连接在您(服务器)和客户端之间的线路。只要插座打开,您就可以在电线上来回发送消息。一旦你致电end(),电线被切断(插座关闭),你不能再发送信息。任何尝试这样做都会导致您收到的错误。

另外值得注意的是,在您拨打socket.end()后JavaScript仍然执行,因此每次调用该函数时,您的代码都会尝试到write -> end -> write -> end。我不太确定你想要达到什么目的,但是你不需要拨打socket.end(),直到你完全使用socket并且不想再发送任何消息。

如果你要有条件地写邮件,您将需要保持某种状态是这样的:

var reqCount = 0; 
function InitSystems(socket){ 
    switch (reqCount) { 
     case 0: 
      socket.write("Message 1: Hi!"); 
      break; 
     case 1: 
      socket.write("Message 2: Event has successfully taken place!"); 
      break; 
    } 

    // You may want to do something to signify the end of a message 
    socket.write('END OF MESSAGE'); 
    reqCount++; 
} 
+0

感谢您的回复!我尝试过,但错误仍然存​​在。在case 0工作的情况下,当case 1执行时,我再次得到错误 – WhiplashOne

+0

这仍然调用'.end()',其中一半关闭套接字,因此无法再次写入。这似乎不是一个解决方案。 – jfriend00

+0

Doh,谢谢。没有读取所有的代码,并假设传入函数的套接字始终是打开的。我已经更新了我的答案。 –