2017-03-08 6 views
0

私は、私のRaspberry pi 3で動作しているNode.jsを使ってTCPサーバーをセットアップしました。私はアンドロイドクライアント([this] [1]チュートリアルのコード) 。初めてクライアントに接続して接続するときだけ、サーバーからの応答が得られます。Node.js - 終了エラーの後に書き込み

私は別のリクエストをしようとすると、リクエストが受信されて処理されますが、レスポンスを送信しているときにエラーが発生します。

コード(編集後):

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); 

EDIT: アンドロイドコード:事前に

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()); 
     } 

ありがとう! 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()た後、あなたが行うことは許されない:

+0

そこに行くのがたくさんあります。あなたのコードを破壊している部分にまで減らすことができますか?しばしば、これは直接問題を指摘するでしょう。また、読みやすいようにコードを書式化してください。あなたのコードエディタはあなたのためにこれを行う必要があります。そうでなければ、[オンライン美容師](http://jsbeautifier.org/)を使うことができます。 –

+0

ソケットで何らかの条件が満たされていなかった場合、3秒でソケットを閉じる 'setTimeout()'があることは分かりますか? – jfriend00

+0

@ jfriend00 setTimeout()を使わずに試しましたが、まだエラーが表示されます – WhiplashOne

答えて

0

はここ(あなたがコメントしたと同じように)あなたの問題です。ソケットは、あなた(サーバー)とクライアントの間に接続されたワイヤーと考えることができます。ソケットが開いている限り、電線を介してメッセージを前後に送信できます。 end()に電話すると、電線が切断され(ソケットが閉じている)、メッセージを送信できなくなります。そうしようとすると、受け取っているエラーが発生します。

また、JavaScriptはsocket.end()を呼び出した後も実行されているので、上記のコードでは、関数が呼び出されるたびにwrite -> end -> write -> endになります。私はあなたが達成しようとしていることを本当に確信していませんが、あなたはソケットで完全に完了し、これ以上メッセージを送信しない限り、socket.end()に電話する必要はありません。あなたは条件付きでメッセージを書きたい場合は

、あなたはこのような状態のいくつかの並べ替えを維持する必要があります。

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

お返事ありがとうございます!私は試みましたが、エラーは依然として続きます。ケース1の場合と同じように動作しますが、ケース1が実行されたときに再びエラーが発生します – WhiplashOne

+0

これはソケットを半分に閉じるために '.end()'を呼び出すので、再度書き込むことはできません。これは解決策ではないようです。 – jfriend00

+0

Doh、ありがとう。コードのすべてを読んでおらず、関数に渡されたソケットが常に開いていると仮定しました。私は私の答えを更新しました。 –