golang面经必学之net包的用法和场景

net基础包

Go语言的net包提供了对网络编程的支持,允许你创建客户端和服务器程序来处理TCP、UDP、Unix Socket等网络连接。以下是net包的一些常用功能及其用法和场景用例:

1. TCP服务器和客户端

net包提供了用于创建TCP服务器和客户端的接口。

用法示例(TCP服务器):

package main

import (
	"fmt"
	"io"
	"net"
)

func handleClient(conn net.Conn) {
	defer conn.Close()
	for {
		// 读取客户端数据
		var buf [512]byte
		n, err := conn.Read(buf[:])
		if err != nil {
			break
		}
		// 回写数据给客户端
		conn.Write(buf[:n])
	}
}

func main() {
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer listener.Close()
	for {
		conn, err := listener.Accept()
		if err != nil {
			continue
		}
		go handleClient(conn) // 为每个连接创建一个goroutine
	}
}

用法示例(TCP客户端):

package main

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

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

	go func() {
		for {
			// 从标准输入读取数据并发送到服务器
			fmt.Print("Enter message ('exit' to quit): ")
			input, err := bufio.NewReader(os.Stdin).ReadString('\n')
			if err != nil {
				return
			}
			if strings.TrimSpace(input) == "exit" {
				conn.Write([]byte("exit\n"))
				return
			}
			conn.Write([]byte(input))
		}
	}()

	// 读取服务器响应
	for {
		var buf [512]byte
		n, err := conn.Read(buf[:])
		if err != nil {
			break
		}
		fmt.Print(string(buf[:n]))
	}
}

2. UDP通信

net包同样支持UDP协议。

用法示例(UDP服务器):


package main

import (
	"fmt"
	"net"
)

func main() {
	addr := net.UDPAddr{
		Port: 8080,
		IP:   net.ParseIP("0.0.0.0"),
	}
	conn, err := net.ListenUDP("udp", &addr)
	if err != nil {
		panic(err)
	}

	defer conn.Close()
	for {
		buffer := make([]byte, 1024)
		n, remoteAddr, err := conn.ReadFromUDP(buffer)
		if err != nil {
			continue // 错误处理
		}
		fmt.Printf("Received data from %v\n", remoteAddr)
		// 处理数据...
	}
}

3. 监听和解析地址

net包可以解析网络地址,并在特定的地址和端口上监听连接。解析地址通常意味着将字符串形式的网络地址转换为net.Addr类型,它是所有地址类型的共同接口。

package main

import (
	"fmt"
	"net"
)

func main() {
	// 解析TCP地址
	tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
	if err != nil {
		panic(err)
	}
	fmt.Println(tcpAddr)
}

这里ResolveTCPAddr函数接受两个参数:网络类型(如"tcp"、"udp"等)和地址(包含主机和端口号)。如果地址解析成功,它将返回一个*net.TCPAddr类型的结构。

场景用例

  1. Web服务器:使用http包(基于net包)创建Web服务器,提供HTTP服务。
  2. 远程API:创建TCP服务器以提供远程API服务,客户端通过TCP连接调用服务端的API。
  3. 实时通信:开发基于TCP的聊天应用或实时通信工具。
  4. 文件传输:创建FTP客户端和服务器,用于文件的上传和下载。
  5. 网络监控:开发网络监控工具,监听特定端口的数据包。
  6. 分布式系统:在分布式系统中,使用自定义TCP或UDP协议进行节点间通信。
  7. IoT设备通信:与IoT设备进行通信,收集数据或发送指令。

net包是Go语言中进行网络编程的基础,通过它可以实现各种网络通信协议和应用。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值