网络:Go 中的第一个 TCP/IP 服务器和客户端
?我们将学到什么
在本教程中,我们将通过构建一个简单而强大的 TCP/IP 服务器和客户端来揭开网络编程的神秘面纱。如果您曾经想知道应用程序如何通过网络进行通信,本指南适合您!
?先决条件
- Go 编程基础知识
- 对网络的好奇心
- 文本编辑器
- 安装到您的计算机上
- 添加了 Go 模块(使用 go mod init tcpIp)
?了解网络通信
在深入研究代码之前,让我们先来分析一下两台计算机通话时发生的情况:
-
TCP/IP:把它想象成一个电话
- TCP(传输控制协议):确保消息完整且按顺序传送
- IP(互联网协议):帮助将消息路由到正确的设备
-
服务器和客户端角色:
- 服务器:等待并监听传入连接
- 客户端:发起联系并发送请求
?️ 项目结构
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
?你学到了什么
- 基本网络通信概念
- 在 Go 中创建 TCP 服务器
- 将客户端连接到服务器
- 安全处理网络连接
- 网络编程中的基本错误管理
?潜在的改进
- 身份验证
- 多客户端支持
- 强大的错误处理
- 加密
?资源
- 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。
