Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js golang tcp套接字-处理多条消息_Node.js_Sockets_Go_Tcp - Fatal编程技术网

Node.js golang 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 {

我有一个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)
  }
}
接受消息,将其转换为字符串并显示,但如果客户端未关闭连接,我将无法看到服务器上显示的消息

如何能够从客户端发送多条消息而无需关闭客户端连接(由客户端)

这里是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的答案(在答案分数下打勾)。