golang网络编程

1 简介

  • Go语言的网络编程主要使用 net 包来实现。该包提供了一组基本的网络功能,包括 TCP 和 UDP 套接字、IP 地址和端口号的处理、以及一些高级特性,如非阻塞 I/O 和 HTTP 客户端库。

  • 本文简单介绍一下如何使用net包进行TCP通信

2 TCP通信

TCP服务端

处理流程:

  1. 监听端口
  2. 接收客户端请求建立链接
  3. 创建goroutine处理链接。

示例1:

package main

import (
	"fmt"
	"net"
)

// TCP server端

func main() {
	// 1.本地端口启动服务
	listener, err := net.Listen("tcp", "127.0.0.1:30000")
	if err != nil {
		fmt.Println("listen failed, err:", err)
		return
	}

	for {
		// 2.建立连接
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept failed, err:", err)
			continue
		}

		// 3.与client端通信
		go processConn(conn)
	}
	listener.Close()
}

// 与client端通信
func processConn(conn net.Conn) {
	tmp := make([]byte, 1024)
	for {
		n, err := conn.Read(tmp)
		if err != nil {
			fmt.Println("read from client failed, err:", err)
			break
		}
		recvStr := string(tmp[:n])
		fmt.Println(recvStr)
	}
	err := conn.Close()
	if err != nil {
		fmt.Println("close failed, err", err)
	}
}

TCP客户端

处理流程:

  1. 建立与服务端的链接
  2. 进行数据收发
package main

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

// TCP client端

func main() {
	// 1.与server建立连接
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("dial failed, err:", err)
	}

	// 2.发送数据
	for {
		/*
			使用bufio包中的ReadString()函数来代替fmt.Scanln()函数。
			这个函数可以读取一行字符串,包括空格、制表符和换行符等空白字符
		*/
		fmt.Print("请输入发送内容:")
		reader := bufio.NewReader(os.Stdin)
		msg, _ := reader.ReadString('\n')
		if msg == "quit" {
			break
		}
		conn.Write([]byte(msg))
	}

	conn.Close()
}

posted @ 2023-08-11 22:43  修凡  阅读(44)  评论(0编辑  收藏  举报