首页 >后端开发 >Golang >网络:Go 中的第一个 TCP/IP 服务器和客户端

网络:Go 中的第一个 TCP/IP 服务器和客户端

Barbara Streisand
Barbara Streisand原创
2024-11-30 15:51:13250浏览

Networking : Your First TCP/IP Server and Client in Go

?我们将学到什么

在本教程中,我们将通过构建一个简单而强大的 TCP/IP 服务器和客户端来揭开网络编程的神秘面纱。如果您曾经想知道应用程序如何通过网络进行通信,本指南适合您!

?先决条件

  • Go 编程基础知识
  • 对网络的好奇心
  • 文本编辑器
  • 安装到您的计算机上
  • 添加了 Go 模块(使用 go mod init tcpIp)

?了解网络通信

在深入研究代码之前,让我们先来分析一下两台计算机通话时发生的情况:

  1. TCP/IP:把它想象成一个电话

    • TCP(传输控制协议):确保消息完整且按顺序传送
    • IP(互联网协议):帮助将消息路由到正确的设备
  2. 服务器和客户端角色:

    • 服务器:等待并监听传入连接
    • 客户端:发起联系并发送请求

?️ 项目结构

tcp-chat-app/
├── server/
│   └── server.go   # Server-side logic
├── client/
│   └── client.go   # Client-side logic
└── main.go         # Starts both server and client

?第 1 步:创建服务器

了解服务器代码

package server

import (
    "log"
    "net"
)

// StartServer: Our digital receptionist 
func StartServer() {
    // Choose a "phone number" (address)
    address := "localhost:8080"

    // Set up a "phone line" to listen for calls
    listener, err := net.Listen("tcp", address)
    if err != nil {
        log.Fatalf("Couldn't set up the phone line: %v", err)
    }
    defer listener.Close()

    log.Printf("Server is ready, waiting for connections on %s", address)

    // Forever wait for incoming "calls"
    for {
        // Accept a new connection
        conn, err := listener.Accept()
        if err != nil {
            log.Printf("Missed a call: %v", err)
            continue
        }

        // Handle each "caller" in a separate conversation
        go handleClient(conn)
    }
}

关键概念解释

  • net.Listen():创建一个网络“套接字”来接收连接
  • Listener.Accept():等待并接受传入连接
  • go handleClient(conn):在单独的线程(goroutine)中处理每个客户端

?处理客户端连接

func handleClient(conn net.Conn) {
    // Always clean up after the conversation
    defer conn.Close()

    log.Printf("New client connected: %s", conn.RemoteAddr())

    // Prepare a message buffer
    buffer := make([]byte, 1024)

    // Keep the conversation going
    for {
        // Read message from client
        n, err := conn.Read(buffer)
        if err != nil {
            log.Printf("Connection error: %v", err)
            return
        }

        // Echo the message back
        message := string(buffer[:n])
        log.Printf("Received: %s", message)
        conn.Write([]byte("Server says: " + message))
    }
}

这里发生了什么?

  • buffer:传入消息的临时存储
  • conn.Read():接收来自客户端的消息
  • conn.Write():将消息发送回客户端

?️ 第 2 步:创建客户端

package client

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

func StartClient() {
    // Dial the server (like making a phone call)
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        log.Printf("Could not connect to server: %v", err)
        return
    }
    defer conn.Close()

    fmt.Println("Connected to server. Start chatting!")

    // Read user input and send to server
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("> ")
        if !scanner.Scan() {
            break
        }

        message := scanner.Text()
        if message == "exit" {
            break
        }

        // Send message to server
        conn.Write([]byte(message + "\n"))

        // Wait for server's response
        response := make([]byte, 1024)
        n, err := conn.Read(response)
        if err != nil {
            log.Printf("Error receiving response: %v", err)
            break
        }

        fmt.Println(string(response[:n]))
    }
}

客户端机制

  • net.Dial():连接到服务器
  • Scanner.Scan():读取用户的键盘输入
  • conn.Write(): 发送消息到服务器
  • conn.Read(): 接收服务器的响应

?将所有内容整合在一起:main.go

package main

import (
    "time"
    "tcpIp/server"
    "tcpIp/client"
)

func main() {
    // Start server in background
    go func() {
        server.StartServer()
    }()

    // Give server a moment to start
    time.Sleep(time.Second)

    // Launch client
    client.StartClient()
}

?‍♂️ 运行您的网络应用程序

go run main.go

?你学到了什么

  1. 基本网络通信概念
  2. 在 Go 中创建 TCP 服务器
  3. 将客户端连接到服务器
  4. 安全处理网络连接
  5. 网络编程中的基本错误管理

?潜在的改进

  • 身份验证
  • 多客户端支持
  • 强大的错误处理
  • 加密

?资源

  • Go 的 net 包文档
  • TCP/IP 协议基础知识
  • Go 中的并发编程

参考

管理。(2023 年 8 月 9 日)。通过适用于所有人的免费交换和路由指南来学习 TCP/IP。诅咒。 https://cursin.net/en/learn-tcp-ip-with-the-free-switching-and-routing-guide-for-everyone/

伍德贝克,A.(2021)。使用 Go 进行网络编程。无淀粉压榨公司

祝您网络愉快! ??

以上是网络:Go 中的第一个 TCP/IP 服务器和客户端的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn