Дълбоко гмуркане в мрежите с 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()…