Дълбоко гмуркане в мрежите с Go

Въведение

Мрежовото програмиране в Go (Golang) е достъпно, мощно и забавно. Това ръководство се гмурка в тънкостите на мрежовото програмиране, обхващайки протоколи, TCP/UDP сокети, паралелност и други, обогатени с подробни коментари.

Ключови понятия

1. Мрежови протоколи

  • TCP (Протокол за контрол на предаването): Осигурява надеждна доставка на данни.
  • UDP (Протокол за потребителски дейтаграми): По-бърз, но не гарантира доставка на данни.

2. Гнезда

  • TCP сокети: Използва се за комуникация, ориентирана към връзка.
  • UDP сокети: Използват се за комуникация без връзка.

3. Паралелност

  • Goroutines: Позволете паралелизъм във вашия код.
  • Канали: Използва се за комуникация между goroutines.

Примери

Пример 1: TCP сървър и клиент

Пример за TCP сървър и клиент демонстрира основите на TCP комуникацията.

Сървър

package main

import (
 "net"
 "fmt"
)

func main() {
 // Listen on TCP port 8080 on all available unicast and
 // any unicast IP addresses.
 listen, err := net.Listen("tcp", ":8080")
 if err != nil {
  fmt.Println(err)
  return
 }
 defer listen.Close()

 // Infinite loop to handle incoming connections
 for {
  conn, err := listen.Accept()
  if err != nil {
   fmt.Println(err)
   continue
  }
  // Launch a new goroutine to handle the connection
  go handleConnection(conn)
 }
}

func handleConnection(conn net.Conn) {
 defer conn.Close()
 buffer := make([]byte, 1024)
 // Read the incoming connection into the buffer.
 _, err := conn.Read(buffer)
 if err != nil {
  fmt.Println(err)
  return
 }
 // Send a response back to the client.
 conn.Write([]byte("Received: " + string(buffer)))
}

Клиент

package main

import (
 "net"
 "fmt"
)

func main() {
 // Connect to the server at localhost on port 8080.
 conn, err := net.Dial("tcp", "localhost:8080")
 if err != nil {
  fmt.Println(err)
  return
 }
 defer conn.Close()…