Maison > développement back-end > Golang > Comment réaliser une communication bidirectionnelle à l'aide de sockets Unix dans Go ?

Comment réaliser une communication bidirectionnelle à l'aide de sockets Unix dans Go ?

Linda Hamilton
Libérer: 2024-12-07 02:54:12
original
416 Les gens l'ont consulté

How to Achieve Bi-Directional Communication Using Unix Sockets in Go?

Sockets Unix en Go : établissement d'une communication bidirectionnelle

Vous essayez d'implémenter une architecture client-serveur simple à l'aide de sockets Unix, mais vous avez rencontré un problème problème de flux de données unidirectionnel. Examinons le code et résolvons le problème.

Dans votre code client, vous envoyez des messages au serveur avec succès, mais le serveur ne répond pas. Cela suggère qu'il vous manque une étape cruciale : la lecture de la réponse du serveur. Dans le code client révisé ci-dessous, nous avons ajouté une goroutine de lecture pour gérer la lecture des données du serveur.

// Client code with a reader goroutine
package main

import (
    "io"
    "log"
    "net"
    "time"
)

func reader(r io.Reader) {
    buf := make([]byte, 1024)
    for {
        n, err := r.Read(buf[:])
        if err != nil {
            return
        }
        println("Client got:", string(buf[0:n]))
    }
}

func main() {
    c, err := net.Dial("unix", "/tmp/echo.sock")
    if err != nil {
        panic(err)
    }
    defer c.Close()

    go reader(c)
    for {
        _, err := c.Write([]byte("hi"))
        if err != nil {
            log.Fatal("write error:", err)
            break
        }
        time.Sleep(1e9)
    }
}
Copier après la connexion

Côté serveur, votre code semble correct. Cependant, il est impératif de gérer les erreurs dans les goroutines et de fermer les connexions une fois terminé, comme indiqué dans le code du serveur modifié ci-dessous :

// Server code with error handling and connection closing
package main

import (
    "log"
    "net"
)

func echoServer(c net.Conn) {
    defer c.Close()  // Ensure connection is closed when the goroutine exits

    for {
        buf := make([]byte, 512)
        nr, err := c.Read(buf)
        if err != nil {
            log.Fatal("read error:", err)
        }

        data := buf[0:nr]
        _, err = c.Write(data)
        if err != nil {
            log.Fatal("write error:", err)
        }
    }
}

func main() {
    l, err := net.Listen("unix", "/tmp/echo.sock")
    if err != nil {
        log.Fatal("listen error:", err)
    }

    for {
        fd, err := l.Accept()
        if err != nil {
            log.Fatal("accept error:", err)
        }

        go echoServer(fd)
    }
}
Copier après la connexion

Avec ces modifications en place, votre communication client-serveur devrait désormais être entièrement bi- directionnel, permettant aux données de circuler dans les deux sens.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal