Go by Example: TCP Server

net paketi TCP soket serverlarini oson qurish uchun bizga kerakli vositalarni taqdim etadi.

package main
import (
    "bufio"
    "fmt"
    "log"
    "net"
    "strings"
)
func main() {

net.Listen serverni berilgan tarmoq (TCP) va manzilda (barcha interfeyslardagi 8090 port) ishga tushiradi.

    listener, err := net.Listen("tcp", ":8090")
    if err != nil {
        log.Fatal("Error listening:", err)
    }

Dastur chiqib ketganda portni bo’shatish uchun listenerni yoping.

    defer listener.Close()

Yangi mijoz ulanishlarini qabul qilish uchun cheksiz sikl.

    for {

Ulanishni kuting.

        conn, err := listener.Accept()
        if err != nil {
            log.Println("Error accepting conn:", err)
            continue
        }

Bu yerda biz ulanishni boshqarish uchun goroutinadan foydalanamiz, shunda asosiy sikl yana ko’proq ulanishlarni qabul qilishni davom ettira oladi.

        go handleConnection(conn)
    }
}

handleConnection bitta mijoz ulanishini boshqaradi, mijozdan bir qator matnni o’qiydi va javob qaytaradi.

func handleConnection(conn net.Conn) {

Mijoz bilan o’zaro aloqani tugatganimizda ulanishni yopish resurslarni bo’shatadi.

    defer conn.Close()

Mijozdan bir qator ma’lumotni (yangi qator bilan tugaydigan) o’qish uchun bufio.NewReader dan foydalaning.

    reader := bufio.NewReader(conn)
    message, err := reader.ReadString('\n')
    if err != nil {
        log.Printf("Read error: %v", err)
        return
    }

Ikki tomonlama aloqani namoyish etib, mijozga javob yaratib qaytarib yuboring.

    ackMsg := strings.ToUpper(strings.TrimSpace(message))
    response := fmt.Sprintf("ACK: %s\n", ackMsg)
    _, err = conn.Write([]byte(response))
    if err != nil {
        log.Printf("Server write error: %v", err)
    }
}

TCP serverni fonda ishga tushiring.

$ go run tcp-server.go &

netcat yordamida ma’lumot yuboring va javobni qabul qiling.

$ echo "Hello from netcat" | nc localhost 8090
ACK: HELLO FROM NETCAT

Keyingi misol: .