Logo

Developer learning path

Go

Использование сокетов в Go

Использование сокетов в Go

15

#description

Go предоставляет библиотеку для работы с сокетами - net. С ее помощью можно создавать TCP, UDP и Unix сокеты.

Для создания соединения основными функциями являются Listen и Dial. Listen используется для прослушивания порта, а Dial - для создания клиентского соединения.

Пример создания TCP сервера:

                    
package main

import (
    "fmt"
    "net"
)

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:12345")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        return 
    }
    defer l.Close()
    fmt.Println("Listening on 127.0.0.1:12345")
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err.Error())
            return 
        }
        fmt.Println("New connection established!")
        // Handle the connection in a new goroutine
        go handleRequest(conn)
    }
}

func handleRequest(conn net.Conn) {
    // Make a buffer to hold incoming data.
    buf := make([]byte, 1024)
    // Read the incoming connection into the buffer.
    _, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return 
    }
    // Send a response back to person contacting us.
    conn.Write([]byte("Message received."))
    // Close the connection when you're done with it.
    conn.Close()
}
                  

Пример создания TCP клиента:

                    
package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    // Connect to a TCP server.
    conn, err := net.Dial("tcp", "127.0.0.1:12345")
    if err != nil {
        fmt.Println("Error connecting:", err.Error())
        os.Exit(1)
    }
    // Send the message to the server.
    _, err = conn.Write([]byte("Hello from client"))
    if err != nil {
        fmt.Println("Error sending message:", err.Error())
        os.Exit(1)
    }
    // Wait for the server to respond.
    response := make([]byte, 1024)
    _, err = conn.Read(response)
    if err != nil {
        fmt.Println("Error receiving response:", err.Error())
        os.Exit(1)
    }
    fmt.Println(string(response))
    // Close the connection when you're done with it.
    conn.Close()
}
                  

Для создания UDP сервера и клиента можно использовать функции net.ListenUDP и net.DialUDP, соответственно.

March 25, 2023

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

Если же непонятен весь вопрос, то нажмите на кнопки внизу, чтобы получить новый вариант объяснения, практические примеры или критически оценить сам вопрос.