【go笔记】TCP编程

简介: 【go笔记】TCP编程

前言

  • TCP服务端的处理流程
  • 监听端口
  • 接收客户端请求建立连接
  • 创建goroutine处理链接

示例代码:TCP服务端

package main
import (
  "net"
  "bufio"
  "fmt"
)
// 处理函数
func process(conn net.Conn) {
  // 最终关闭连接
  defer conn.Close()
  for {
    reader := bufio.NewReader(conn)
    var buf [128]byte
    // 读取数据
    n,err := reader.Read(buf[:])
    if err != nil {
      fmt.Println("Read from client failed, error: ",err)
      break
    }
    recvStr := string(buf[:n])
    fmt.Println("收到client端发来的数据: ",recvStr)
    // 发送数据
    conn.Write([]byte(recvStr))
  }
}
func main() {
  listen, err := net.Listen("tcp", "0.0.0.0:8000")
  if err != nil {
    fmt.Println("Listen Port 0.0.0.0:8000 failed, error: ",err)
    return
  }
  for {
    conn, err := listen.Accept()
    if err != nil {
      fmt.Println("Accept failed, error: ",err)
      continue
    }
    go process(conn)
  }
}

示例代码:TCP客户端

package main
import (
  "fmt"
  "net"
  "bufio"
  "os"
  "strings"
)
func main() {
  conn, err := net.Dial("tcp", "127.0.0.1:8000")
  if err != nil {
    fmt.Println("connect to 127.0.0.1:8000 error, error: ",err)
    return
  }
  // 关闭连接
  defer conn.Close()
  inputReader := bufio.NewReader(os.Stdin)
  for {
    // 读取输入
    input,_ := inputReader.ReadString('\n')
    inputInfo := strings.Trim(input, "\r\n")
    // 输入q推出
    if strings.ToUpper(inputInfo) == "Q" {
      return
    }
    // 发送数据
    _,err = conn.Write([]byte(inputInfo))
    if err != nil {
      fmt.Println(err)
      return
    }
    buf := [512]byte{}
    n, err := conn.Read(buf[:])
    if err != nil {
      fmt.Println("recv failed, error: ",err)
      return
    }
    fmt.Println(string(buf[:n]))
  }
}

参考文档

相关文章
|
2月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
43 1
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
47 7
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
3月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
63 7
|
3月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
4月前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
4月前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
4月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
4月前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
3月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化