文章目录
- 前言
- TCP监听回环
- 代码
- 演示
- 附:UDP监听回环
前言
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)
}
}