Go网络编程:基于TCP的网络服务端与客户端

Go 语言的 net 包为网络编程提供了简洁高效的接口。我们可以使用它快速构建 TCP 网络服务,如聊天服务器、RPC、微服务通信等。


一、TCP简介

TCP(Transmission Control Protocol)是面向连接的、可靠的传输协议,通信模型为客户端-服务端(Client-Server)。

基本流程:

Client -----> Server(连接)
Client <----> Server(数据收发)
Client -----X Server(断开)

二、TCP服务端开发流程

1. 基本步骤
  • • 创建监听器 net.Listen("tcp", address)
  • • 接收连接 ln.Accept()
  • • 启动协程处理每个连接
2. 示例代码:简单回显服务端
package mainimport ("bufio""fmt""net"
)func main() {ln, err := net.Listen("tcp", ":8000")if err != nil {panic(err)}fmt.Println("Server is listening on :8000...")for {conn, err := ln.Accept()if err != nil {fmt.Println("Accept error:", err)continue}go handleConnection(conn)}
}func handleConnection(conn net.Conn) {defer conn.Close()fmt.Println("Client connected:", conn.RemoteAddr())scanner := bufio.NewScanner(conn)for scanner.Scan() {msg := scanner.Text()fmt.Println("Received:", msg)conn.Write([]byte("Echo: " + msg + "\n"))}
}

三、TCP客户端开发流程

1. 基本步骤
  • • 使用 net.Dial("tcp", address) 发起连接
  • • 使用 conn.Write() 发送数据
  • • 使用 conn.Read() 或 bufio.Scanner 接收响应
2. 示例代码:简单回显客户端
package mainimport ("bufio""fmt""net""os"
)func main() {conn, err := net.Dial("tcp", "localhost:8000")if err != nil {panic(err)}defer conn.Close()fmt.Println("Connected to server.")scanner := bufio.NewScanner(os.Stdin)for {fmt.Print("Input: ")if !scanner.Scan() {break}text := scanner.Text()conn.Write([]byte(text + "\n"))reply := bufio.NewReader(conn)msg, _ := reply.ReadString('\n')fmt.Print("Server reply: " + msg)}
}

四、服务端并发处理连接

  • • 每个连接使用 go handleConnection(conn) 启动一个 goroutine。
  • • 利用 channel、sync 等包实现更复杂的控制逻辑。
  • • 避免 goroutine 泄漏,及时关闭连接。

五、进阶技巧与注意事项

问题建议
粘包/拆包问题采用固定长度协议或使用 \n 等分隔符协议
异常断开检测读取错误后及时清理资源
超时控制使用 conn.SetDeadline 设置读写超时
多客户端广播/聊天群使用 map 管理连接池,遍历发送消息

六、实战小案例:群聊服务端片段

var clients = make(map[net.Conn]string)
var broadcast = make(chan string)func main() {go broadcaster()// 省略监听与连接处理...
}func handleConnection(conn net.Conn) {defer conn.Close()clients[conn] = conn.RemoteAddr().String()for scanner.Scan() {msg := scanner.Text()broadcast <- clients[conn] + ": " + msg}delete(clients, conn)
}func broadcaster() {for {msg := <-broadcastfor conn := range clients {fmt.Fprintln(conn, msg)}}
}

七、总结

  • • TCP 是基础但强大的通信方式,适用于高可靠性场景。
  • • Go 的并发模型使构建高性能网络服务变得简单。
  • • 在生产环境中,还需结合日志、连接池、协议封装等技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85789.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【StarRocks系列】架构、核心概念

目录 一、架构&#xff1a;分布式 MPP 列式存储 向量化引擎 二、存储&#xff1a;高性能列式存储引擎 三、表设计&#xff1a;三类模型适配不同场景 四、数据写入&#xff1a;多种方式支持实时与批量 五、数据读取&#xff1a;极致优化的查询引擎 总结&#xff1a;Star…

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…

iOS开发中的安全实践:如何通过Ipa混淆与加固确保应用安全

随着移动应用技术的不断发展&#xff0c;开发者越来越重视应用的安全性&#xff0c;尤其是iOS应用。无论是面对大规模的数据泄露问题&#xff0c;还是在应用上线后避免被逆向破解&#xff0c;开发者们都需要采取一系列技术手段来保护应用。然而&#xff0c;很多开发者在应用开发…

JAVA实战开源项目:智慧生活商城系统 (Vue+SpringBoot) 附源码

本文项目编号 T 245 &#xff0c;文末自助获取源码 \color{red}{T245&#xff0c;文末自助获取源码} T245&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

GNU Octave 基础教程(8):GNU Octave 常用数学函数

目录 一、基本算术运 二、初等数学函数 三、三角函数与反三角函数 四、统计函数 五、复数与其他函数 ✅ 小结 &#x1f51c; 下一讲预告 GNU Octave 内置了大量数学函数&#xff0c;涵盖初等数学、线性代数、复数运算、统计函数等&#xff0c;非常适合科研、工程计算使用…

Go语言中的文件与IO:JSON、CSV、XML处理

在数据交换与存储中&#xff0c;JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持&#xff0c;涵盖结构体映射、读写文件、编码解码等操作。 一、JSON处理&#xff08;encoding/json&#xff09; 1. 基本使用&#xff1a;结构体 <-> JSON type U…

三种语言写 MCP

参考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…

Python训练营-Day38-Dataset和Dataloader类

在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的方法。为此&#xff0c;PyTorch提供了DataLoader类&#xff0c;该类可以自动将数据集切分为多个批次batch&#xff0c;并支持多线程加载数据。此外&#xff0c;还存在Datase…

SVN上传代码

SVN&#xff08;Subversion&#xff09;是一个常用的版本控制系统&#xff0c;提供了对代码管理和协作的支持。以下是SVN常见操作&#xff08;如获取代码、上传代码、合并冲突处理等&#xff09;的命令行流程及实例&#xff1a; 1. 获取代码&#xff08;Checkout&#xff09; 在…

【appium】2.初始连接脚本配置

连接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…

FliTik翻页时钟v1.1.25.36,支持安卓TV/手机/车机+windows电脑端

FliTik翻页时钟v1.1.25.36&#xff0c;支持安卓TV/手机/车机windows电脑端 FliTik翻页时钟是一款集高颜值与强大功能于一身的全平台数字时钟工具类应用&#xff0c;支持TV、iOS、安卓、PC以及鸿蒙系统。它不仅拥有精美的翻页动画…

以AI赋能创意未来:即梦3.0与Seedance1.0Lite重磅登陆POE!

近年来&#xff0c;随着人工智能技术的不断突破&#xff0c;AI模型的应用场景也在逐渐拓宽。在这一过程中&#xff0c;如何整合和利用现有的AI技术&#xff0c;实现更为便捷的创作服务&#xff0c;成为了许多科技企业关注的焦点。近日&#xff0c;全球知名的AI模型整合平台POE正…

云计算与5G:如何利用5G网络优化云平台的性能

想象一下&#xff0c;你正在用手机看视频、进行在线游戏&#xff0c;甚至是使用云存储来保存你的重要文件。所有这些背后&#xff0c;其实都离不开一个无形的力量——云计算。而今天&#xff0c;5G网络的出现&#xff0c;就像为这些云服务加装了一对翅膀&#xff0c;让它们飞得…

GPT-1 与 BERT 架构

GPT-1 架构特点 仅解码器架构&#xff1a;摈弃了传统transformer中的编码器层&#xff0c;而是直接用解码器和自注意力&#xff0c;同时抛弃掉了交叉多头注意力层&#xff0c;自注意力通过mask来完成计算。注意力块添加到12个&#xff0c;Attention的输出维数为762维&#xff0…

Day04_C语言基础数据结构重点复习笔记20250618

1.什么是计算机的大小端存储&#xff1f; 答&#xff1a;大端是数据的高位字节存储在低地址&#xff0c;低位字节存储在高地址&#xff0c;网络协议&#xff08;如TCP/IP&#xff09;通常采用大端序&#xff08;称为“网络字节序”&#xff09;。例如&#xff1a;32位整数 0x12…

基于OpenSSL实现AES-CBC 128算法的 SeedKey DLL的生成与使用

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

进程间通信、线程间通信

进程间通信、线程间通信 进程间通行&#xff08;Inter-Process Communication&#xff0c; IPC&#xff09;和线程间通信&#xff08;Thread Communication&#xff09;的方式不完全相同&#xff0c;因为进程和线程的运行环境和特性不同 进程和线程的本质区别 进程 进程是操…

【FPGA学习】FPGA入门学习即数字逻辑复习

前言&#xff1a;最近开始学习FPGA了&#xff0c;希望通过博客记录下每一次学习的过程&#xff0c;与大家共勉。 目录 一、组合逻辑电路的设计&#xff08;工程学习引入&#xff09; 二、3-8译码器设计、下载和功能演示&#xff08;在的8段数码管显示&#xff09; 2.1 Logs…

ffmpeg python rgba图片合成 4444格式mov视频,保留透明通道

def convert_pngs_to_mov(input_pattern, output_path, frame_rate30):"""将BGRA四通道PNG序列转换为ProRes 4444编码的MOV视频&#xff08;保留透明通道&#xff09;参数:input_pattern: PNG序列路径模式&#xff08;如&#xff1a;"/path/to/frames/fram…

Java 实现 PDF 转图片功能:实战教程 + 场景解析

作者:云起川南|专注 Java 实战与自动化集成 在 PDF 文档处理的各类业务场景中,“将 PDF 页面转为图片”是一个高频、刚需的功能,广泛应用于 预览展示、文件归档、图片加密水印、OCR 文本识别 等系统中。 本文将带你一步一步实战如何使用 Java 实现 PDF 转图片 功能,使用开…