Как получить данные отдельно от двух параллельных процессов, запущенных на сервере? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь построить базовую клиент-серверную архитектуру, в которой между ними существует некоторый обмен данными, а также некоторая обработка с обеих сторон.Таким образом, мой сервер имеет два потока, которые отправляют некоторые данные на клиентскую сторону.Я хочу знать, как получать эти данные отдельно в две разные переменные.

Я узнал, хотя я все еще не уверен, что это как-то связано с такими понятиями, как состояние гонки, блокировка мьютекса и т. Д. У меня естьосновная идея о них, но никогда не использовал их практически.Я хочу знать, есть ли какое-то заранее разработанное решение для этой проблемы.

Сторона сервера:

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])
}

Оба "Текст 1"и" Текст 2 "читаются переменной buff.Я хочу сделать так, как будто есть две отдельные переменные buff1 и buff2 для хранения обоих текстов по отдельности.

1 Ответ

0 голосов
/ 04 апреля 2019

Вы читаете соединение только один раз, и вы должны ожидать, что получите все данные за один вызов. Вы можете разделять свои сообщения с помощью разделителя, такого как символ новой строки, и в цикле читать данные этим разделителем. Таким образом, вы получили два разных сообщения. Я сделал тебе образец для проверки.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...