当前位置: 首页 > 知识库问答 >
问题:

golang tcp套接字-处理多条消息

董桐
2023-03-14

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

共有2个答案

袁增
2023-03-14

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

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

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

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

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

章玮
2023-03-14

因为您得到的是一个恒定的数据流,服务器需要知道如何分离消息。一种方法是使用新的行字符。

我已经在下面修改了你的代码。

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');
});
 类似资料:
  • 我是一个初学者程序员,所以这很可能是显而易见的,我忽略了答案。但说到这个问题。 我有一个由两部分组成的程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个PrintWriter来向客户机发送消息,在客户机上有一个BufferedReader来读取发送的消息。当这个例子运行时,我得到了两行作为输出。第一个消息是两个消息,第二个消息是NULL。

  • 我有几个关于Java套接字编程的问题。 > 我有一个进程需要跨多个套接字连接发送一条消息。现在我有如下内容 这是原子能的吗?或者,在并发环境中,它们是否有可能在几乎相同的时间发送? 在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经互斥?比如说,两个线程想要同时写入PrintWriter。如果没有在PrintWriter上显式互斥,流的任何输出都会被弄乱吗?

  • 我试图编写套接字错误处理(确切地说是错误111-连接拒绝),但什么也没有发生。终端打印错误号111发生,但它没有做任何事情: Traceback(最近的调用为last):文件“test.py”,第20行,在s.connect((IP,PORT))中文件“/usr/lib/python2.7/socket.py”,第224行,在meth返回getattr(self._sock,name)(*args

  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套

  • 我在一个简单的ftp服务器上工作,客户端必须向服务器发送多条消息,对于每条消息,服务器向客户端发回一个应答。当客户端发送一条消息时,它可以完美地工作,并且服务器没有任何问题地响应,例如,当客户端发送“用户用户名”时,服务器向客户端发回“需要密码”。 但是当客户端发送另一条消息“PASS密码”(使用同一个套接字)时,它不起作用!只有第一个交换有效(对于用户名),当发送第一条消息时,服务器应答器没有任

  • 我有发送消息的路由。消息首先保存在数据库中,然后广播给房间中的每个聊天订阅者。消息已成功保存,但服务器(节点/快递/打字稿)在命中 socket.io 实例时崩溃。错误是: 错误发送消息错误:回调不支持广播时,在BroadcastOperator.emit(/用户/Myname/桌面/代码/myapp/服务器/node_modules/socket.io/dist/broadcast-operat