我有这个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
软件包文档中:https://golang.org/pkg/io/#Copy,复制函数将复制,直到遇到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');
});
我是一个初学者程序员,所以这很可能是显而易见的,我忽略了答案。但说到这个问题。 我有一个由两部分组成的程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个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