Go语言网络编程介绍以及案例运用

发布时间:2024年01月22日

一.Go网络编程概述

1. 基本概念

  • TCP 和 UDP: Go语言支持TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的、面向连接的通信,而UDP提供无连接的快速数据传输。
  • 并发: Go语言的并发模型是通过goroutines实现的。每个网络请求都可以在自己的goroutine中处理,实现高效的并发。
  • Channels: 用于在goroutines之间安全地传递数据。

2. net包

  • 核心组件: net包提供了网络I/O的基础设施,包括TCP/UDP协议,以及DNS解析。

二.创建TCP服务器

1.监听端口

goCopy codeln, err := net.Listen("tcp", ":8080")
if err != nil {
    // 处理错误
}

2.接受连接并处理

goCopy codefor {
    conn, err := ln.Accept()
    if err != nil {
        // 处理错误
        continue
    }
    go handleConnection(conn)
}

3.处理连接

goCopy codefunc handleConnection(conn net.Conn) {
    // 使用conn读取和写入数据
    conn.Close()
}

三.创建TCP客户端

1.建立连接

goCopy codeconn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
    // 处理错误
}

2.发送和接收数据

goCopy code// 发送数据
conn.Write([]byte("hello\n"))

// 接收数据
bufio.NewReader(conn).ReadString('\n')

3.关闭连接

goCopy code
conn.Close()

4.使用UDP

  1. 建立UDP连接

    goCopy code
    conn, err := net.Dial("udp", "localhost:8081")
    
  2. 发送和接收数据

    goCopy codeconn.Write([]byte("hello"))
    buf := make([]byte, 1024)
    n, _, err := conn.ReadFromUDP(buf)
    

四.综合案例

1.服务端-server.go

package main

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

func main() {
	listener, err := net.Listen("tcp", "localhost:8888")
	if err != nil {
		fmt.Println("开启服务端错误:", err)
		return
	}
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("接收错误:", err)
			continue // 改为continue,可以处理下一个连接
		}
		go handleConnection(conn)
	}
}

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

	// 读取客户端数据
	message, err := bufio.NewReader(conn).ReadString('\n')
	if err != nil {
		fmt.Println("读取错误:", err)
		return
	}
	fmt.Println("Message Received:", message)

	// 回发数据
	response := "收到你的消息了:" + message
	conn.Write([]byte(response))
}

2.客户端-client.go

package main

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

func main() {
	conn, err := net.Dial("tcp", "localhost:8888")
	if err != nil {
		fmt.Println("连接错误:", err)
		return
	}
	defer conn.Close()

	// 发送数据
	message := "玩游戏\n"
	_, err = conn.Write([]byte(message))
	if err != nil {
		fmt.Println("发送数据错误:", err)
		return
	}
	fmt.Println("发送数据:", message)

	// 读取响应
	response, err := bufio.NewReader(conn).ReadString('\n')
	if err != nil {
		fmt.Println("读取响应错误:", err)
		return
	}
	fmt.Println("收到响应:", response)
}

文章来源:https://blog.csdn.net/qq_49195366/article/details/135747346
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。