Node.js golang tcp套接字-处理多条消息
我有一个Go tcp套接字Node.js golang tcp套接字-处理多条消息,node.js,sockets,go,tcp,Node.js,Sockets,Go,Tcp,我有一个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 {
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: "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从
io
软件包文档:,复制功能将一直复制到遇到EOF
您不需要手动发送EOF,但关闭连接的客户端会这样做,因此复制功能可以完成复制
您可以使用bufio
package读取带分隔符的字符串:
line, err := bufio.NewReader(conn).ReadString('\n')
在上述情况下,分隔符是新行字符。您可以重用读卡器重复调用其上的ReadString来检索更多消息 因为您获得的是恒定的数据流,服务器需要知道如何分离消息。一种方法是使用新行字符 我已经在下面修改了你的代码 Go服务器: 包干管
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');
});
var net=require('net');
让数据包={
目标:{主机:,端口:“9000”},
姓名:{家庭:“Newmarch”,个人:“Jan”},
电邮:[
{种类:“家”,地址:jan@newmarch.name"},
{种类:“工作”,地址:“j。newmarch@boxhill.edu.au"}
]
}
var client=new net.Socket();
client.connect(1200,'0.0.0.0',function(){
console.log('Connected');
//发送10条信息
对于(变量i=0;i<10;i++){
write((新的缓冲区(JSON.stringify(packet),'UTF-8'));
client.write('\n');
}
client.end();
});
client.on('data',函数(data){
console.log('接收:'+数据);
client.destroy();
});
client.on('close',function()){
console.log(“连接关闭”);
});
正如答案所述,您必须以某种方式中断您的消息。TCP本身是一种流媒体协议,而不是基于数据包的协议。谢谢Nebril,这是对的,现在也可以按照Tomaz的解释工作了。@internet3很高兴知道,请随意接受我或Tomaz的答案(在答案分数下打勾)。