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

我来详细讲解一下“Go语言服务器开发之简易TCP客户端与服务端实现方法”的完整攻略。

简介

本攻略将会介绍如何使用Go语言实现简单的TCP客户端与TCP服务端,并且在两者之间成功地建立连接。TCP(Transmission Control Protocol)是一种基于连接的协议,是因特网基础设施的一部分,用于传输数据。

实现方法

TCP服务端

首先,我们需要编写TCP服务端的代码。服务端需要首先监听客户端的连接请求,并且在连接成功后,接受客户端发送的数据,并对其进行处理。下面是一个简单的TCP服务端实现代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 监听端口
    l, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        return
    }
    // 等待连接请求
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err.Error())
            return
        }
        // 新建一个协程处理连接
        go func(conn net.Conn) {
            // 处理连接
            handleConnection(conn)
        }(conn)
    }
}

// 处理连接函数
func handleConnection(conn net.Conn) {
    // 关闭连接
    defer conn.Close()
    // 读取客户端数据
    buf := make([]byte, 1024)
    _, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    // 输出客户端发送的数据
    fmt.Printf("Received data: %s\n", string(buf))
}

在程序中,我们使用 net.Listen 方法监听8080端口的请求,并且在该端口接收到客户端请求后,通过 l.Accept 方法接受客户端连接。接着,我们将接受到的连接交由一个新的协程处理,该协程调用 handleConnection 函数并处理接收到的数据。在 handleConnection 函数中,我们使用 conn.Read 方法读取客户端发送的数据,并且简单地将其输出到终端上。

TCP客户端

在TCP客户端中,我们需要向服务端发送连接请求,并且在连接成功后,向服务端发送数据。下面是一个简单的TCP客户端实现代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println("Error connecting:", err.Error())
        return
    }
    // 发送数据
    _, err = conn.Write([]byte("Hello world!"))
    if err != nil {
        fmt.Println("Error sending:", err.Error())
        return
    }

    // 收到回复
    buf := make([]byte, 1024)
    _, err = conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    fmt.Printf("Received data: %s\n", string(buf))

    // 关闭连接
    conn.Close()
}

在程序中,我们使用 net.Dial 方法连接服务端,在成功建立连接后,通过 conn.Write 方法向服务端发送数据,并且使用 conn.Read 方法读取服务端发送回来的数据。

示例说明

示例1:本地通讯

我们在本地创建一个TCP服务端,并通过TCP客户端与之建立连接,成功地发送和接收数据,如下所示:

服务端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 监听端口
    l, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        return
    }
    fmt.Println("TCP server start...")

    // 等待连接请求
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err.Error())
            return
        }
        go func(conn net.Conn) {
            // 处理连接
            handleConnection(conn)
        }(conn)
    }
}

// 处理连接函数
func handleConnection(conn net.Conn) {
    // 关闭连接
    defer conn.Close()
    // 读取客户端数据
    buf := make([]byte, 1024)
    _, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    // 输出客户端发送的数据
    fmt.Printf("Received data: %s\n", string(buf))
    // 发送响应
    _, err = conn.Write([]byte("Hello client!"))
    if err != nil {
        fmt.Println("Error writing:", err.Error())
        return
    }
}

客户端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        fmt.Println("Error connecting:", err.Error())
        return
    }
    // 发送数据
    _, err = conn.Write([]byte("Hello server!"))
    if err != nil {
        fmt.Println("Error sending:", err.Error())
        return
    }

    // 收到回复
    buf := make([]byte, 1024)
    _, err = conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    fmt.Printf("Received data: %s\n", string(buf))

    // 关闭连接
    conn.Close()
}

我们在本地分别运行服务端和客户端代码,可以看到服务端成功地接收到了客户端发送的数据,同时客户端也成功地收到了服务端发送回来的数据。

示例2:跨主机通讯

我们将TCP服务端程序部署在云服务器上,并且通过TCP客户端向该服务器发送数据,测试其网络通信情况,如下所示:

服务端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 监听端口
    l, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        return
    }
    fmt.Println("TCP server start...")

    // 等待连接请求
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err.Error())
            return
        }
        go func(conn net.Conn) {
            // 处理连接
            handleConnection(conn)
        }(conn)
    }
}

// 处理连接函数
func handleConnection(conn net.Conn) {
    // 关闭连接
    defer conn.Close()
    // 读取客户端数据
    buf := make([]byte, 1024)
    _, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    // 输出客户端发送的数据
    fmt.Printf("Received data: %s\n", string(buf))
    // 发送响应
    _, err = conn.Write([]byte("Hello client!"))
    if err != nil {
        fmt.Println("Error writing:", err.Error())
        return
    }
}

客户端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接服务器
    conn, err := net.Dial("tcp", "123.12.34.56:8080") // 修改为自己云服务器IP地址
    if err != nil {
        fmt.Println("Error connecting:", err.Error())
        return
    }
    // 发送数据
    _, err = conn.Write([]byte("Hello server!"))
    if err != nil {
        fmt.Println("Error sending:", err.Error())
        return
    }

    // 收到回复
    buf := make([]byte, 1024)
    _, err = conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    fmt.Printf("Received data: %s\n", string(buf))

    // 关闭连接
    conn.Close()
}

我们将服务端程序部署在云服务器上,并通过TCP客户端向该服务器发送数据,可以看到客户端成功连接上服务端,并且服务端成功地接收到了客户端发送的数据,同时客户端也成功地收到了服务端发送回来的数据。这说明网络通信正常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言服务器开发之简易TCP客户端与服务端实现方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • java格式化数字操作 NumberFormat及DecimalFormat

    让我为您讲解一下“java格式化数字操作 NumberFormat及DecimalFormat”的攻略。 1. NumberFormat及DecimalFormat简介 NumberFormat是java.util包中的一个抽象类,是将数字格式化为字符串的基类,它提供了很多方法来格式化数字,例如将数字格式化为货币、百分数等。 DecimalFormat是Nu…

    other 2023年6月26日
    00
  • script中integrity

    以下是“script中integrity的完整攻略”的标准markdown格式文本,其中包含两个示例: script中integrity的完整攻略 在Web开发中,我们经常需要引入外部脚本(script),为了确保脚本的完整性和安全性,我们可以使用integrity属性。以下是script中integrity的完整攻略。 1. integrity属性的语法 …

    other 2023年5月10日
    00
  • React中的CSS局部引入过程

    当在React中使用CSS时,可以使用局部引入的方式来管理样式。这种方式可以确保每个组件的样式只应用于该组件本身,而不会影响其他组件。下面是React中CSS局部引入的完整攻略: 创建一个React组件,并在组件的同级目录下创建一个CSS文件。例如,我们创建一个名为\”Button\”的组件,并在同级目录下创建一个名为\”Button.css\”的CSS文件…

    other 2023年8月6日
    00
  • 在RecyclerView中实现button的跳转功能

    当在RecyclerView中需要实现按钮的跳转功能时,可以按照以下步骤进行操作: 在RecyclerView的Adapter中,为每个列表项添加一个按钮。可以在列表项的布局文件中添加一个Button控件,并为其设置一个唯一的ID。 示例代码: <Button android:id=\"@+id/button_item\" andr…

    other 2023年8月23日
    00
  • 如何在visualstudiocode中注释多行?

    以下是在Visual Studio Code中注释多行的完整攻略,包括两个示例说明: 1. 使用快捷键注释多行 在Visual Studio Code中,我们可以使用快捷键Ctrl + /(Windows和Linux)或Command + /(Mac)来注释多行代码。以下是详细步骤: 选中要注释的多行代码。 按下Ctrl + /(Windows和Linux)…

    other 2023年5月7日
    00
  • 关于java:如何将object转换为boolean?

    在Java中,我们可以使用类型转换来将Object类型转换为boolean类型。在本攻略中,我们将详细讲解如何将Object类型转换为boolean类型提供两个示例说明。 使用Boolean.valueOf()方法 可以使用Boolean.valueOf()方法将Object类型转换为boolean类型。该方法接受一个类型的参数,并返回一个boolean类型…

    other 2023年5月9日
    00
  • layui实现表单、表格中复选框checkbox的全选功能

    以下是关于“layui实现表单、表格中复选框checkbox的全选功能”的完整攻略,包含两个示例说明。 layui中的复选checkbox 在layui中,选框checkbox是一种常用的表单元素,它可以于选择多个项在表格中,复选框checkbox也常用于多个行。 layui中的全功能 在layui中,我们可以使用全选功能来选择所有的复选框checkbox。…

    other 2023年5月9日
    00
  • base64位加密解密

    以下是base64位加密解密的完整攻略,包括两个示例说明。 1. base64简介 base64是一种编码方式,可以将二进制数据转换为可打印的ASCII字符。base64编码后的数据长度通常比原始数据长度略长,但可以在网络传输中方便地传输二进制数据。 2. base64加密 要使用base64加密数据,可以按照以下步骤进行: 导入base64库:在Java代…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部