Go语言之网络编程

一、网络编程基础

二、TCP Socket编程

(一)流程

首先应该了解服务端和客户端的处理流程:

1、服务端处理流程

  • 监听端口
  • 接收客户端tcp链接,建立双方的链接
  • 创建goroutine,处理该链接的请求

2、客户端处理流程

  • 建立与服务端的链接
  • 与服务端进行通信
  • 关闭链接

(二)代码实现

1、服务端(server.go)

package main

import (
    "fmt"
    "net"
)

func processReq(conn net.Conn) {
    // 延时关闭conn
    defer conn.Close()
    // 与服务端进行通讯
    for {
        // 创建一个切片,盛放消息
        buf := make([]byte, 1024)
        // 1、等待客户端通过conn发送消息
        // 2、如果没有消息,协程就阻塞在这里
        m, err := conn.Read(buf)
        if err != nil {
            fmt.Println("客户端退出")
            return
        }
        // 3、显示客户端发送的内容
        fmt.Print(string(buf[:m]))
    }
}

func main() {
    fmt.Println("服务器开始监听,等待客户端的连接:")
    ls, err := net.Listen("tcp", "0.0.0.0:9000")

    if err != nil {
        return
    }
    // 延时关闭listen
    defer ls.Close()

    // 等待客户端连接
    for {
        fmt.Println("等待客户端来连接:")
        conn, err := ls.Accept()
        if err != nil {
            return
        } else {
            fmt.Printf("con=%v, 客户端ip=%v\n", conn, conn.RemoteAddr().String())
        }

        // 每一个客户端启动一个协程处理,防止过长时间相应
        go processReq(conn) //conn接口类型,是引用

    }
}

2、客户端(client.go)

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }

    reader := bufio.NewReader(os.Stdin)

    // 进行通讯
    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("客户端读取终端输入出错了...")
        }
        // 将line数据发送到服务器
        _, err = conn.Write([]byte(line))
        if err != nil {
            fmt.Println("客户端发送数据出错了...")
        }

    }

}

Original: https://www.cnblogs.com/shenjianping/p/15937915.html
Author: iveBoy
Title: Go语言之网络编程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535798/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 惨,给Go提的代码被批麻了

    hello大家好,我是小楼。 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章《我好像发现了一个Go的Bug?》。 之后我就向Go提交了…

    Go语言 2023年5月25日
    070
  • Go语言之高级篇beego框架之model设计构造查询

    一、model设计构造查询 QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句。 QueryBuilder…

    Go语言 2023年5月29日
    037
  • GO语言 文件操作实例

    package main import ( "bufio" "fmt" "io/ioutil" "os&quo…

    Go语言 2023年5月29日
    046
  • 大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14

    众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象…

    Go语言 2023年5月25日
    076
  • croncli 定时器命令(golang)

    定时器是执行任务时的常用功能,配置系统的定时任务太麻烦,所以就想用golang简单实现一个定时器命令。 定时器的参数包括: $ croncli -h 定时器命令 Usage: cr…

    Go语言 2023年5月25日
    050
  • 通过Go语言创建CA与签发证书

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Go语言 2023年5月25日
    051
  • 记一次提升18倍的性能优化

    背景 最近负责的一个自研的 Dubbo 注册中心经常收到 CPU 使用率的告警,于是进行了一波优化,效果还不错,于是打算分享下思考、优化过程,希望对大家有一些帮助。 自研 Dubb…

    Go语言 2023年5月25日
    070
  • 基于LSM的Key-Value数据库实现WAL篇

    上篇文章简单的实现了基于LSM数据库的初步版本,在该版本中如数据写入到内存表后但还未持久化到SSTable排序字符串表,此时正好程序崩溃,内存表中暂未持久化的数据将会丢失。 引入W…

    Go语言 2023年5月25日
    052
  • Go微服务框架go-kratos学习05:分布式链路追踪 OpenTelemetry 使用

    一、分布式链路追踪发展简介 1.1 分布式链路追踪介绍 关于分布式链路追踪的介绍,可以查看我前面的文章 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习(ht…

    Go语言 2023年5月25日
    043
  • 【golang】分布式缓存 – lru算法实现

    最近复习操作系统,看到了lru算法,就去网上搜索下,因此发现了GeeCache,顺手写了一遍。研究下lru算法的实现。 正文: lru使用map+链表实现。map里面存储了key以…

    Go语言 2023年5月25日
    033
  • Go代码规范梳理

    注释语句 // Request 表示运行命令的请求。 type Request struct { … // Encode 将 req 的 JSON 编码写入 w 。 func …

    Go语言 2023年5月25日
    060
  • 在开发中将git运用自如

    写这篇文章的初衷是记录自己在开发中使用git遇到的问题和如何利用git进行高效的开发。个人理解来看,很多人对git运用不自如主要是两方面的原因:1、死记硬背命令,这个其实可以通过h…

    Go语言 2023年5月25日
    042
  • Go语言的goroutine

    Go世界里,每一个并发执行的活动成为goroutine。 通过创建goroutine,就可以实现并行运算,十分方便。 如果有函数f(),那么: f():调用函数f(),并且等待它返…

    Go语言 2023年5月29日
    054
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    071
  • Go语言之反射

    一、反射的基本概念 (一)什么是反射 反射可以再运行时动态获取变量的各种信息,比如变量的类型、值等 如果时结构体变量,还可以获取到结构体本身的各种信息,比如结构体的字段、方法 通过…

    Go语言 2023年5月29日
    068
  • go程序添加远程调用tcpdump功能

    最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器、交换机)将它们的各种统计数据上报采集、整理后交后端的各类AI分…

    Go语言 2023年5月25日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球