2016-09-07 11 views
1

私はこの囲碁TCPソケットgolangのTCPソケット - プロセス、複数のメッセージ

package main 

import (
    "fmt" 
    "io" 
    "log" 
    "net" 
    "bytes" 
) 

func main() { 

    l, err := net.Listen("tcp", ":1200") 
    if err != nil { 
    log.Fatal(err) 
    } 
    defer l.Close() 
    for { 

    conn, err := l.Accept() 
    if err != nil { 
     log.Fatal(err) 
    } 

    go func(c net.Conn) { 

     var buf bytes.Buffer 
     io.Copy(&buf, c) 
     fmt.Println("total size:", buf.Len()) 
     s := buf.String() 
     println(s) 

     c.Close() 
    }(conn) 
    } 
} 

を持って、メッセージを受け入れるそれを文字列に変換し、それを表示するが、接続がクライアントによって閉じられていない場合、私はすることができませんサーバー上に期待通りに表示されたメッセージを参照してください。

クライアント接続を閉じる必要なくクライアントから複数のメッセージを送信するにはどうすればいいですか?ここでは、クライアントNodeJs

var net = require('net'); 

let packet = { 
       Target: { Host: "", Port: "9000" }, 
       Name: { Family: "Newmarch", Personal: "Jan" }, 
       Email: [ 
         { Kind: "home", Address: "[email protected]"}, 
         { Kind: "work", Address: "[email protected]"} 
        ] 
} 


var client = new net.Socket(); 
client.connect(1200, '0.0.0.0', function() { 
    console.log('Connected'); 
    client.write((new Buffer(JSON.stringify(packet), 'UTF-8'))); 
    client.end(); 
    //client.write('\n'); 
}); 

client.on('data', function(data) { 
    console.log('Received: ' + data); 
    client.destroy(); 
}); 

client.on('close', function() { 
    console.log('Connection closed'); 
}); 

ありがとうvaleriano cossu

+0

の答えは、あなたが何らかの形であなたのメッセージを破るする必要が述べたように。 TCP自体はストリーミングプロトコルであり、パケットベースのものではありません。 –

答えて

1
ioパッケージのドキュメントから

https://golang.org/pkg/io/#Copy、それはEOFに遭遇するまで、コピー機能コピー。

EOFを手動で送信するのではなく、クライアントが接続を終了するので、コピー機能はコピーを完了できます。

あなたの区切り文字を含む文字列を読み取るためにbufioパッケージを使用することができます。上記の場合

line, err := bufio.NewReader(conn).ReadString('\n') 

を、区切り文字は改行文字です。リーダーを再利用してReadStringを繰り返し呼び出すと、より多くのメッセージを取得できます。

+0

ネブリルありがとう、そうです、今はTomazも説明したように動作します。 – internet3

+0

@ internet3知っておいてよかったですか、私のこと、またはTomazの答え(答えの点数の下のティック)を自由に受け入れてください。 – Nebril

2

データのストリームが一定になっているため、サーバーはメッセージを分離する方法を知る必要があります。これを行う1つの方法は、改行文字を使用することです。

私は以下のコードを改訂しました。

囲碁サーバー: パッケージクライアントNodejsメイン

import (
    "bufio" 
    "log" 
    "net" 
) 

func main() { 

    l, err := net.Listen("tcp", ":1200") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer l.Close() 
    for { 

     conn, err := l.Accept() 
     if err != nil { 
      log.Fatal(err) 
     } 

     go func(c net.Conn) { 
      for { 
       message, err := bufio.NewReader(conn).ReadString('\n') 
       if err != nil { 
        log.Printf("Error: %+v", err.Error()) 
        return 
       } 

       log.Println("Message:", string(message)) 
      } 
     }(conn) 
    } 
} 

var net = require('net'); 

let packet = { 
       Target: { Host: "", Port: "9000" }, 
       Name: { Family: "Newmarch", Personal: "Jan" }, 
       Email: [ 
         { Kind: "home", Address: "[email protected]"}, 
         { Kind: "work", Address: "[email protected]"} 
        ] 
} 


var client = new net.Socket(); 
client.connect(1200, '0.0.0.0', function() { 
    console.log('Connected'); 

    // Send 10 messages 
    for(var i = 0; i < 10; i++) { 
    client.write((new Buffer(JSON.stringify(packet), 'UTF-8'))); 
    client.write('\n'); 
    } 

    client.end(); 

}); 

client.on('data', function(data) { 
    console.log('Received: ' + data); 
    client.destroy(); 
}); 

client.on('close', function() { 
    console.log('Connection closed'); 
}); 
+0

Tomaz、ありがとう! – internet3