当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • TCP监听回环
    • 代码
    • 演示
  • 附:UDP监听回环

前言

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

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

TCP监听回环

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

代码

package mainimport ("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]bytelen, 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 mainimport ("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]bytelen, 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)}
}
http://www.lryc.cn/news/517741.html

相关文章:

  • 《浮岛风云》V1.0中文学习版
  • Day10——爬虫
  • 10. C语言 函数详解
  • NRC优先级中比较特殊的—NRC0x13和NRC0x31
  • ref() 和 reactive() 区别
  • 深度学习与计算机视觉 (博士)
  • Sprint Boot教程之五十:Spring Boot JpaRepository 示例
  • NaVILA:用于足式机器人导航的VLA模型
  • 大语言模型提示技巧(七)-扩展
  • 基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址
  • 25年01月HarmonyOS应用基础认证最新题库
  • wps宏js接入AI功能和接入翻译功能
  • 【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件
  • 深度学习:Java DL4J基于RNN构建智能停车管理模型
  • 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%
  • 2025年:AI化浪潮中的社会变迁与商业革新
  • filebeat、kafka
  • js单例模式
  • 【设计模式】装饰器与代理模式的对比
  • Proteus-8086调试汇编格式的一点心得
  • 什么是Kafka?有什么主要用途?
  • SpringBoot插件
  • UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击
  • Nginx实现接口复制
  • Selenium 八大元素定位方法及场景扩展
  • WebRTC 的优缺点详细解析
  • B树及其Java实现详解
  • 下载ffmpeg执行文件
  • Redis高频知识点
  • Boost.Asio 同步读写及客户端 - 服务器实现详解