Go语言服务器开发之简易TCP客户端与服务端实现方法

 更新时间:2015年02月08日 12:17:08   作者:books1958  
这篇文章主要介绍了Go语言服务器开发之简易TCP客户端与服务端实现方法,实例分析了基于Go语言实现的简易服务器的TCP客户端与服务器端实现技巧,需要的朋友可以参考下

本文实例讲述了Go语言服务器开发之简易TCP客户端与服务端实现方法。分享给大家供大家参考。具体实现方法如下:

Go语言具备强大的服务器开发支持,这里示范了最基础的服务器开发:通过TCP协议实现客户端与服务器的通讯。

一 服务端,为每个客户端新开一个goroutine

复制代码 代码如下:
func ServerBase() { 
    fmt.Println("Starting the server...") 
    //create listener 
    listener, err := net.Listen("tcp", "192.168.1.27:50000") 
    if err != nil { 
        fmt.Println("Error listening:", err.Error()) 
        return 
    } 
 
    // listen and accept connections from clients: 
    for { 
        conn, err := listener.Accept() 
        if err != nil { 
            fmt.Println("Error accepting:", err.Error()) 
            return 
        } 
        //create a goroutine for each request. 
        go doServerStuff(conn) 
    } 

 
func doServerStuff(conn net.Conn) { 
    fmt.Println("new connection:", conn.LocalAddr()) 
    for { 
        buf := make([]byte, 1024) 
        length, err := conn.Read(buf) 
        if err != nil { 
            fmt.Println("Error reading:", err.Error()) 
            return 
        } 
 
        fmt.Println("Receive data from client:", string(buf[:length])) 
    } 
}

二 客户端 连接服务器,并发送数据

复制代码 代码如下:
func ClientBase() { 
    //open connection: 
    conn, err := net.Dial("tcp", "192.168.1.27:50000") 
    if err != nil { 
        fmt.Println("Error dial:", err.Error()) 
        return 
    } 
 
    inputReader := bufio.NewReader(os.Stdin) 
    fmt.Println("Please input your name:") 
    clientName, _ := inputReader.ReadString('\n') 
    inputClientName := strings.Trim(clientName, "\n") 
 
    //send info to server until Quit 
    for { 
        fmt.Println("What do you send to the server? Type Q to quit.") 
        content, _ := inputReader.ReadString('\n') 
        inputContent := strings.Trim(content, "\n") 
        if inputContent == "Q" { 
            return 
        } 
 
        _, err := conn.Write([]byte(inputClientName + " says " + inputContent)) 
        if err != nil { 
            fmt.Println("Error Write:", err.Error()) 
            return 
        } 
    } 
}

注:由于LiteIDE不支持同时运行多个程序,所以需要在终端通过 go run 命令来同时运行服务端和(一个或多个)客户端,可观察到服务器对并发访问的支持。

希望本文所述对大家的Go语言程序设计有所帮助。

相关文章

  • golang 设置web请求状态码操作

    golang 设置web请求状态码操作

    这篇文章主要介绍了golang 设置web请求状态码操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言fmt.Sprintf格式化输出的语法与实例

    Go语言fmt.Sprintf格式化输出的语法与实例

    Go 可以使用 fmt.Sprintf 来格式化字符串,下面这篇文章主要给大家介绍了关于Go语言fmt.Sprintf格式化输出的语法与实例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 详解如何通过Go来操作Redis实现简单的读写操作

    详解如何通过Go来操作Redis实现简单的读写操作

    作为最常用的分布式缓存中间件——Redis,了解运作原理和如何使用是十分有必要的,今天来学习如何通过Go来操作Redis实现基本的读写操作,需要的朋友可以参考下
    2023-09-09
  • Go语言运行环境安装详细教程

    Go语言运行环境安装详细教程

    这篇文章主要介绍了Go语言运行环境安装详细教程,本文讲解了Linux、MAC OS、Windows下的安装方法,同时讲解了验证是否安装成功、第三方工具安装运行环境的方法,需要的朋友可以参考下
    2014-10-10
  • Go素数筛选分析详解

    Go素数筛选分析详解

    学习Go语言的过程中,遇到素数筛选的问题。这是一个经典的并发编程问题,是某大佬的代码,短短几行代码就实现了素数筛选,这篇文章主要介绍了Go素数筛选分析,需要的朋友可以参考下
    2022-10-10
  • golang中protobuf的使用详解

    golang中protobuf的使用详解

    protobuf是Google公司提出的一种轻便高效的结构化数据存储格式,常用于结构化数据的序列化,具有语言无关、平台无关、可扩展性特性,常用于通讯协议、服务端数据交换场景,下面我们就来看看golang中protobuf的具体使用吧
    2023-10-10
  • go通过编码缩短字符串的长度实现方法步骤

    go通过编码缩短字符串的长度实现方法步骤

    这篇文章主要为大家介绍了go通过编码缩短字符串的长度实现方法步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结

    Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结

    这篇文章主要介绍了Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结,本文直接给出操作代码,同时对代码加上了详细注释,需要的朋友可以参考下
    2014-11-11
  • Go语言继承功能使用结构体实现代码重用

    Go语言继承功能使用结构体实现代码重用

    今天我来给大家介绍一下在 Go 语言中如何实现类似于继承的功能,让我们的代码更加简洁和可重用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go语言题解LeetCode1160拼写单词示例详解

    go语言题解LeetCode1160拼写单词示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode1160拼写单词示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论