golang tcp socket – 处理多个消息

我有这个Go 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) } } 

接受一条消息,将其转换为string并显示,但如果连接未被客户端closures,则无法按预期的方式查看在服务器上显示的消息

如何从客户端发送多条消息而不需要closures客户端连接(由客户端)?

这里的客户端在NodeJs中

 var net = require('net'); let packet = { Target: { Host: "", Port: "9000" }, Name: { Family: "Newmarch", Personal: "Jan" }, Email: [ { Kind: "home", Address: "jan@newmarch.name"}, { Kind: "work", Address: "j.newmarch@boxhill.edu.au"} ] } 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

因为你正在得到一个不断的数据stream,服务器需要知道如何分离消息。 这样做的一个方法是使用一个新的行字符。

我修改了下面的代码。

去服务器:包主

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

Nodejs客户端:

 var net = require('net'); let packet = { Target: { Host: "", Port: "9000" }, Name: { Family: "Newmarch", Personal: "Jan" }, Email: [ { Kind: "home", Address: "jan@newmarch.name"}, { Kind: "work", Address: "j.newmarch@boxhill.edu.au"} ] } 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'); }); 

io软件包文档: https : //golang.org/pkg/io/#Copy复制function复制,直到遇到EOF。

您不会手动发送EOF,但closures连接的客户端会这样做,所以Copyfunction可以完成复制。

您可以使用bufio包来使用您的分隔符来读取string:

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

在上述情况下,分隔符是新行字符。 您可以重复使用读取器重复调用ReadString来检索更多的消息。