go实现tcp网络编程

简介: go实现tcp网络编程

本文只做为go tcp编程入门参考

tcp服务端实现:

package tcp
import (
   "bufio"
   "fmt"
   "net"
)
//声明服务器启用状态,预留状态变量
var SERVER\_STATUS int8 = STATUS\_UN_START
//状态变量枚举
const (
   STATUS\_UN\_START            int8 = 0
   STATUS\_START\_START_ING     int8 = 1
   STATUS\_START\_START_SUCCESS int8 = 2
   STATUS_CLOSE               int8 = 3
)
//启动server
func StartServer(listenAddress string) {
   //将状态更新为正在启动
   SERVER\_STATUS = STATUS\_START\_START\_ING
   //监听tcp协议
   listen, err := net.Listen("tcp", listenAddress)
   if err != nil {
      fmt.Println("listen failed,err:", err)
   }
   fmt.Println("tcp listen success.")
   //将状态改为启动成功
   SERVER\_STATUS = STATUS\_START\_START\_SUCCESS
   defer func() {
      //如果发生了异常,则直接关闭服务
      SERVER\_STATUS = STATUS\_CLOSE
      _ = listen.Close()
   }()
   for {
      //关闭监听
      //如果全局变量变为已关闭,则退出循环
      if SERVER\_STATUS == STATUS\_CLOSE {
         break
      }
      //接收客户端连接
      conn, err := listen.Accept()
      if err != nil {
         fmt.Println("accept failed,err:", err)
         continue
      }
      //新开协程处理客户端数据
      go tcpProcess(conn)
   }
}
func tcpProcess(conn net.Conn) {
   //如果发生异常或者结束栈,则关闭此连接
   defer func() {
      conn.Close()
   }()
   for true {
      //关闭监听
      if SERVER\_STATUS == STATUS\_CLOSE {
         break
      }
      //读取数据
      reader := bufio.NewReader(conn)
      //声明一个二进制数组
      var buf \[128\]byte
      //读取
      n, err := reader.Read(buf\[:\])
      if err != nil {
         fmt.Println("read from client failed,err:", err)
         return
      }
      //将二进制数据转为string
      recvStr := string(buf\[:n\])
      fmt.Println("收到client端发来的数据:", recvStr)
      //发送数据到客户端
      conn.Write(\[\]byte("已收到数据"))
   }
}

调用:

package main
import (
   "testProject/tcp"
   "fmt"
   "sync"
)
var wg sync.WaitGroup
func main() {
   address := "127.0.0.1:9999"
   //+1
   wg.Add(1)
   go func() {
      tcp.StartServer(address)
      //只有tcp结束之后,才会走到这,-1
      wg.Done()
   }()
   //main协程阻塞,直到server结束
   wg.Wait()
   fmt.Println("进程结束")
}

输出:


image.png


tcp客户端

package tcp
import (
   "bufio"
   "fmt"
   "net"
   "os"
   "strings"
)
//连接服务器
func ConnectServer(address string) {
   conn, err := net.Dial("tcp", address)
   if err != nil {
      fmt.Println("connect server failed:", err)
      return
   }
   fmt.Println("tcp client connect success.")
   //如果结束栈,则关闭此连接
   defer func() {
      conn.Close()
   }()
   //声明从标准输入读取数据
   inputReader := bufio.NewReader(os.Stdin)
   for true {
      fmt.Println("请输入需要发送的数据")
      //读到\\n符号则返回数据
      input, _ := inputReader.ReadString('\\n')
      //去除\\r\\n
      inputInfo := strings.Trim(input, "\\r\\n")
      //如果接收到quit,则退出此客户端
      if strings.ToLower(inputInfo) == "quit" {
         return
      }
      //将读取到的数据发送到服务端
      _, err = conn.Write(\[\]byte(inputInfo))
      if err != nil {
         return
      }
      buf := \[128\]byte{}
      //从服务端读取数据
      n, err := conn.Read(buf\[:\])
      if err != nil {
         fmt.Println("recv failed,err:", err)
         return
      }
      fmt.Println("tcp client 收到数据:", string(buf\[:n\]))
   }
}

调用:

package main
import "testProject/tcp"
func main() {
   address := "127.0.0.1:9999"
   tcp.ConnectServer(address)
}

调用结果:

image.png

目录
相关文章
|
4月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
269 61
|
3月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
101 12
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
4月前
|
运维 网络协议 Go
Go网络编程:基于TCP的网络服务端与客户端
本文介绍了使用 Go 语言的 `net` 包开发 TCP 网络服务的基础与进阶内容。首先简述了 TCP 协议的基本概念和通信流程,接着详细讲解了服务端与客户端的开发步骤,并提供了简单回显服务的示例代码。同时,文章探讨了服务端并发处理连接的方法,以及粘包/拆包、异常检测、超时控制等进阶技巧。最后通过群聊服务端的实战案例巩固知识点,并总结了 TCP 在高可靠性场景中的优势及 Go 并发模型带来的便利性。
|
7月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
266 12
|
8月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
216 20
|
8月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
224 5
|
10月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
230 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
8月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
157 0
|
8月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
188 0
下一篇
oss教程