0

コード スニペットに少し問題があります。プロジェクトの TCP ソケット通信を学習する例を作成しました。今のところ、TCP ソケットを送信して回答を読み取ることはできますが、その回答を他のソフトウェア部分で使用したいと考えています。そのために、変数 socketmessage を使用しようとしましたが、これは機能しません。誰かが私の問題に対する答えを持っていますか? どうもありがとう

var net = require('net');
var client = new net.Socket();
var HOST='127.0.0.1';
var PORT='20000';

var MSG="{\"REQUEST\":\"STATUS\"}";    
var socketmessage;

socketmessage=getSocketMessage(MSG);
console.log ("Socket Message: " + socketmessage);

function getSocketMessage(tcpmsg){
  var outData;

  client.connect(PORT, HOST, function() {
    console.log("Client: " + tcpmsg);
    client.write(tcpmsg);
  });

  client.setTimeout(5000, function() {  client.destroy(); });

  client.on('data', function(data) {
    console.log('Server: ' + data);
    outData = data.toString('utf8');
    console.log ("Socketmessage: " + outData);
    client.destroy();
  });

  //Add a 'close' event handler for the client socket
  client.on('close', function() {
    console.log('Connection closed');
  });

  // Add a 'error' event handler for the client socket
  client.on('error', function(error) {
    console.log('Error Connection: ' + error);
  });

  return outData;
}

ターミナル: ソケット メッセージ: 未定義 クライアント: {"REQUEST":"STATUS"} サーバー: {"STATUS":0.000000}

4

2 に答える 2

2

これは、関数getSocketMessageが非同期であるためです。受信したメッセージを返そうとしています。関数はすぐに戻り、その時点outDataでは未定義です。その値は、サーバーからデータが到着したときに設定されます。ネットワーク I/O はイベント化され、使用するイベントはdata

client.on('data', function(data) {

受信したメッセージは、 のイベント ハンドラ内でのみ適切に処理できますdata。ここから他の部分を呼び出す必要があります。

于 2013-10-02T15:24:44.387 に答える