Как эффективно использовать функции сети в Go? - PullRequest
3 голосов
/ 22 сентября 2011

Например, имея базовый пакетный протокол, например:

[packageType int] [packetId int] [data [] byte]

И заставить клиента и сервер делать простые вещи (например, в чате).

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

Вот клиент и сервер с небрежной обработкой ошибок паники.У них есть некоторые ограничения:

  • Сервер обрабатывает только одно клиентское соединение одновременно.Вы можете исправить это, используя goroutines.
  • Пакеты всегда содержат 100-байтовые полезные данные.Вы можете исправить это, поместив длину в пакет где-нибудь и не используя кодирование / двоичный файл для всей структуры, но я сохранил это простым.

    Вот клиент.Он отправляет один пакет с типом пакета 0, идентификатором 0 и содержимым «Hello, server».Затем он ждет ответа, печатает его и выходит.

    package main
    
    import (
        "encoding/binary"
        "fmt"
        "net"
    )
    
    type packet struct {
        Type int32
        Id   int32
        Data [100]byte
    }
    
    func main() {
        // connect to localhost on port 2000
        conn, err := net.Dial("tcp", ":2000")
        if err != nil {
            panic(err.String())
        }
        defer conn.Close()
    
        // send a packet
        msg := packet{}
        copy(msg.Data[:], "Hello, server")
        err = binary.Write(conn, binary.BigEndian, &msg)
        if err != nil {
            panic(err.String())
        }
    
        // receive the response
        var response packet
        err = binary.Read(conn, binary.BigEndian, &response)
        if err != nil {
            panic(err.String())
        }
        fmt.Printf("Response: %s\n", response.Data)
    }
    
3 голосов
/ 23 сентября 2011

Проверьте Ян 100% * "Сетевое программирование на Go" Яна Ньюмарха

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...