为了账号安全,请及时绑定邮箱和手机立即绑定

golang tcp socket - 处理多条消息

golang tcp socket - 处理多条消息

Go
当年话下 2022-03-07 22:54:24
我有这个 Go tcp 套接字package mainimport (  "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');});
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

因为您正在获得源源不断的数据流,所以服务器需要知道如何分隔消息。一种方法是使用换行符。


我在下面修改了您的代码。


转到服务器:包 main


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');

});


查看完整回答
反对 回复 2022-03-07
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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

您不会手动发送 EOF,但关闭连接的客户端会这样做,因此 Copy 功能可以完成复制。

您可以使用bufio包来读取带有分隔符的字符串:

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

在上述情况下,分隔符是换行符。您可以重复使用阅读器在其上重复调用 ReadString 以检索更多消息。


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信