go - 如何从服务器上运行的两个并发进程分别接收数据?
问题描述
我正在尝试构建一个基本的客户端/服务器架构,其中两者之间有一些数据交换,并且双方也有一些处理。所以我的服务器有两个线程正在向客户端发送一些数据。我想知道如何将这些数据分别接收到两个不同的变量中。
尽管我仍然不确定,但我了解到这与竞争条件、互斥锁等概念有关。我对它们有一个基本的了解,但从未实际使用过它们。我想知道是否有一些关于这个问题的预先设计的解决方案。
服务器端:
func handleConn(conn net.Conn) {
go func() {
io.WriteString(conn, "Text 1")
}()
go func() {
io.WriteString(conn, "Text 2")
}()
}
客户端:
func SocketClient(ip string, port string) {
addr := strings.Join([]string{ip, port}, ":")
conn, err := net.Dial("tcp", addr)
defer conn.Close()
if err != nil {
log.Fatalln(err)
}
buff := make([]byte, 1024)
n, _ := conn.Read(buff)
log.Printf("Received: %s", buff[:n])
}
“Text 1”和“Text 2”都由变量 buff 读取。我想让它像有两个单独的变量 buff1 和 buff2 来分别保存两个文本。
解决方案
您只需读取一次连接,就应该期望在一次调用中接收到全部数据。您可以使用换行符之类的分隔符分隔消息,并在循环中通过该分隔符读取数据。这样就好像您收到了两条不同的消息。我做了一个样品供你检查。
package main
import (
"bufio"
"io"
"log"
"net"
"sync"
)
func handleConn(conn net.Conn) {
go func() {
io.WriteString(conn, "Text 1\n")
}()
go func() {
io.WriteString(conn, "Text 2\n")
}()
}
func SocketClient() {
conn, err := net.Dial("tcp", ":3000")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
if err != nil {
log.Fatalln(err)
}
reader := bufio.NewReader(conn)
for {
buff, err := reader.ReadString('\n')
if err != nil {
log.Fatalln(err)
}
log.Printf("Received: %s", buff)
}
}
func main() {
wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
a, _ := net.Listen("tcp", ":3000")
wg.Done()
for {
conn, err := a.Accept()
if err != nil {
log.Fatalln(err)
}
handleConn(conn)
}
}()
wg.Wait()
SocketClient()
}
输出:
Received: Text 1
Received: Text 2
推荐阅读
- r - 动态选择带闪亮的输入时如何使用renderPrint显示实际变量名称
- javascript - Nextjs - Reactjs - 链接模式 - 不变违规:React.Children.only 预计会收到单个 React 元素子元素
- android - 将 uint8_t* 缓冲区转换为 jobject
- html -
不断脱落
- marklogic - 如何在 MarkLogic 中建立实体关系
- tensorflow - 使用 tensorflow 填充序列时出现“MemoryError”
- javascript - AngularJS - 在指令内的 $render 上动态应用类
- npm - NPM:无效的包名“无标题文件夹”:名称只能包含 URL 友好字符
- vhdl - 带启动的 VHDL 有限状态机计数器
- javascript - HTML 和纯 javascript 中的搜索框查找所有匹配的锚标记并显示结果