Golang笔记:使用net包进行TCP监听回环测试

前言

TCP是比较基础常用的网络通讯方式,这篇文章将使用Go语言实现TCP监听回环测试。

本文中使用 Packet Sender 工具进行测试,其官网地址如下:
https://packetsender.com/

TCP监听回环

Go中TCP功能主要由net包提供,使用起来比较简单。

代码

package main

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

func main() {
	listen, err := net.Listen("tcp", ":22333") // 监听本地所有网卡 tcp 22333 端口
	checkError(err)
	for {
		conn, err := listen.Accept() // 监听客户端的连接请求
		checkError(err)
		fmt.Println("New client connected.")
		go process(conn) // 启动一个goroutine来处理客户端的连接请求
	}
}

func checkError(err error) (eof bool) {
	if err != nil {
		if err == io.EOF { // 若异常是io.EOF,说明连接断开
			return true
		}
		fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error())
		// os.Exit(1)
	}
	return false
}

func process(conn net.Conn) {
	defer conn.Close() // 关闭连接
	for {
		var buf [65536]byte
		len, err := conn.Read(buf[:]) // 读取数据,该操作会阻塞至读取到数据或连接中断
		if checkError(err) {
			fmt.Println("Client disconnect.")
			return
		}
		fmt.Println(string(buf[:len])) // 向终端打印收到的消息
		_, err = conn.Write(buf[:len]) // 发送数据
		if checkError(err) {
			fmt.Println("Client disconnect.")
			return
		}
	}
}

代码比较简单,没什么特别需要注意的。

演示

在这里插入图片描述
上面演示试了TCP非长连接和长连接两种情况。

附:UDP监听回环

下面是UDP监听回环的代码,因为不存在长连接的情况,相比TCP稍微更简单一些。

package main

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

func main() {
	udpAddr, err := net.ResolveUDPAddr("udp4", ":22333") // 转换地址,作为服务器使用时需要监听本机的一个端口
	checkError(err)
	conn, err := net.ListenUDP("udp", udpAddr) // 启动UDP监听本机端口
	checkError(err)

	for {
		var buf [16384]byte
		len, addr, err := conn.ReadFromUDP(buf[:]) // 读取数据,返回值依次为读取数据长度、远端地址、错误信息 // 读取操作会阻塞直至有数据可读取
		checkError(err)
		fmt.Println(string(buf[:len]))            // 向终端打印收到的消息
		_, err = conn.WriteToUDP(buf[:len], addr) // 写数据,返回值依次为写入数据长度、错误信息 // WriteToUDP()并非只能用于应答的,只要有个远程地址可以随时发消息
		checkError(err)
	}
}

func checkError(err error) {
	if err != nil {
		fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error())
		// os.Exit(1)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值