您现在的位置是:首页 > GO语言教程 > 正文

Go语言实现 socket 实例教程及源码解析

编辑:本站更新:2024-09-04 09:56:37人气:1920
在计算机网络编程中,Socket 是一种进程间通信机制,用于在网络中的两个节点之间建立可靠的双向数据通道。接下来我们将深入探讨如何使用 Go 语言来实现实现 Socket 编程,并通过实例代码进行详细解读。

**一、基础概念与准备工作**

首先,在 Go 中处理 sockets 主要依赖于 "net" 包下的 `tcp` 和 `udp` 原生支持。TCP(传输控制协议)提供面向连接的稳定服务,适用于要求高可靠性的应用;UDP(用户数据报协议),则提供了无连接的数据报模式,适合实时性和效率优先的应用场景。

go

import (
"fmt"
"net"
)


**二、服务器端socket创建和监听**

以下是一个简单的 TCP server 端程序示例:

go

func startTCPServer(address string) error {
listener, err := net.Listen("tcp", address)
if err != nil {
return fmt.Errorf("failed to listen on %s: %v", address, err)
}

defer func() { _ = listener.Close() }()

for {
conn, err := listener.Accept()
if err != nil {
// 处理错误并继续等待新的客户端链接请求
fmt.Println(err.Error())
continue
}

go handleConnection(conn) // 使用goroutine并发地为每个新接入的client服务
}
}

// 单独定义一个函数用来处理来自客户端的消息
func handleConnection(c net.Conn) {
defer c.Close()

buf := make([]byte, 1024)

_, err := c.Read(buf)
if err != nil {
fmt.Printf("Failed reading from client :%v\n",err)
return
}

messageFromClient := strings.TrimSpace(string(buf))
fmt.Printf("Received msg '%s' from the client.\n",messageFromClient)

replyMessage := "Hello! I received your message."
bytesToSend := []byte(replyMessage)

_, err = c.Write(bytesToSend)
if err != nil{
fmt.Println("Error replying back ",err)
return
}
}

上述代码展示了启动一个本地 Tcp Server 的过程:首先调用 Listen 函数开始监听指定地址上的连接请求,当有客户机发起连接时 Accept 方法会返回一个新的 Conn 对象表示此次连接。对于每一个新建的连接我们都会开启一个新的 goroutine 来独立处理其后续收发消息的过程。

**三、客户端socket创建以及发送接收数据**

下面展示的是对应的 TCP 客户端部分代码:

go

func connectToServer(serverAddress string) (string,error){
conn,err:= net.Dial("tcp","localhost:"+serverPort)
if err!=nil{
return "", errors.New("Could not dial")
}
defer conn.Close()

messageSent := "Hi there!"
fmt.Fprintf(conn,"%s\r\n", messageSent )

replyBytes := make([]byte,512)
n ,_:=conn.Read(replyBytes)

receivedReply := string((replyBytes)[0:n])
return receivedReply,nil

}

在这段客户端逻辑里,Dial 功能被用来初始化到目标主机和服务端口的新连接。接着向远程服务器发送一条字符串信息并通过 Read 接收回对方回应的信息内容。

总结来说,Go 在处理 socket 连接上以其简洁高效的特性为我们展现了强大的一面。无论是搭建高性能的服务端还是编写功能完善的客户端应用程序都变得十分轻松易行。通过对以上源码的理解学习,开发者可以进一步掌握基于 Go 实现的各种复杂网络交互需求的设计与开发工作。
关注公众号

www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源

PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

最新推荐

本月推荐