温馨提示×

Linux下Golang的网络编程技巧

小樊
41
2025-10-22 18:22:37
栏目: 编程语言

在Linux下使用Golang进行网络编程时,可以利用Go语言标准库中的"net"包来实现各种网络功能。以下是一些常用的网络编程技巧:

  1. 创建TCP服务器和客户端:
// TCP服务器
package main

import (
	"bufio"
	"fmt"
	"net"
)

func main() {
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error:", err)
			continue
		}
		go handleConnection(conn)
	}
}

func handleConnection(conn net.Conn) {
	defer conn.Close()

	reader := bufio.NewReader(conn)
	for {
		message, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("Error:", err)
			break
		}
		fmt.Print("Received message: ", message)
		conn.Write([]byte("Message received\n"))
	}
}

// TCP客户端
package main

import (
	"bufio"
	"fmt"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", "localhost:8080")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	go func() {
		reader := bufio.NewReader(conn)
		for {
			message, err := reader.ReadString('\n')
			if err != nil {
				fmt.Println("Error:", err)
				break
			}
			fmt.Print("Received message: ", message)
		}
	}()

	reader := bufio.NewReader(conn)
	for {
		fmt.Print("Enter message: ")
		message, _ := reader.ReadString('\n')
		conn.Write([]byte(message))
	}
}
  1. 创建UDP服务器和客户端:
// UDP服务器
package main

import (
	"fmt"
	"net"
)

func main() {
	address, err := net.ResolveUDPAddr("udp", ":8080")
	if err != nil {
		panic(err)
	}

	conn, err := net.ListenUDP("udp", address)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	buffer := make([]byte, 1024)
	for {
		n, addr, err := conn.ReadFromUDP(buffer)
		if err != nil {
			fmt.Println("Error:", err)
			continue
		}
		fmt.Printf("Received message: %s from %s\n", string(buffer[:n]), addr.String())
		conn.WriteToUDP([]byte("Message received"), addr)
	}
}

// UDP客户端
package main

import (
	"fmt"
	"net"
)

func main() {
	address, err := net.ResolveUDPAddr("udp", "localhost:8080")
	if err != nil {
		panic(err)
	}

	conn, err := net.DialUDP("udp", nil, address)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	go func() {
		buffer := make([]byte, 1024)
		for {
			n, _, err := conn.ReadFromUDP(buffer)
			if err != nil {
				fmt.Println("Error:", err)
				break
			}
			fmt.Printf("Received message: %s\n", string(buffer[:n]))
		}
	}()

	reader := bufio.NewReader(conn)
	for {
		fmt.Print("Enter message: ")
		message, _ := reader.ReadString('\n')
		conn.Write([]byte(message))
	}
}
  1. 使用goroutine和channel实现并发服务器:
package main

import (
	"bufio"
	"fmt"
	"net"
)

func handleConnection(conn net.Conn, ch chan string) {
	defer conn.Close()

	reader := bufio.NewReader(conn)
	for {
		message, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("Error:", err)
			break
		}
		ch <- message
	}
}

func main() {
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer listener.Close()

	ch := make(chan string)

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error:", err)
			continue
		}
		go handleConnection(conn, ch)
	}

	// 处理接收到的消息
	for message := range ch {
		fmt.Print("Received message: ", message)
	}
}
  1. 使用context实现超时控制:
package main

import (
	"context"
	"fmt"
	"net"
	"time"
)

func main() {
	address, err := net.ResolveTCPAddr("tcp", "localhost:8080")
	if err != nil {
		panic(err)
	}

	conn, err := net.DialTCP("tcp", nil, address)
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()

	done := make(chan bool)
	go func() {
		buf := make([]byte, 1024)
		_, err := conn.Read(buf)
		if err != nil {
			fmt.Println("Error:", err)
			done <- false
			return
		}
		fmt.Println("Message received")
		done <- true
	}()

	select {
	case <-ctx.Done():
		fmt.Println("Timeout")
	case result := <-done:
		if result {
			fmt.Println("Message processed")
		}
	}
}

这些技巧可以帮助你在Linux下使用Golang进行网络编程。你可以根据自己的需求进行调整和扩展。

0