Go实现socket编程

本文介绍了Go语言如何实现Socket长连接,相较于http的短连接,Socket提供了一种全双工的长连接方式,适合需要实时通信的场景。文章通过代码示例展示了服务器端和客户端的实现,并分享了实践中的经验和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,博客地址:
https://blog.youkuaiyun.com/zxy_666/article/details/80164544,未经博主允许不得转载。


前言

在后端服务的开发中,网络通信往往是必不可少的。http连接是我们经常会用到的,但http可视为一种“短连接”,客户端若想访问服务器,每次都需要发出请求,服务器一旦返回响应,该次访问的链接就断了。客户端下次访问时,还得重新发起请求。
这种短连接并不能满足所有网络通信的场景,有时我们需要一种“长连接”。所谓“长连接”,就是指,通信双方一旦建立连接,该连接就会持续保持,直到任意一方主动关闭连接或因某种外部因素导致连接断掉(如网络不通,程序bug等)。在连接保持中,通信是双向的,也就是全双工的,通信双方随时都可以将数据发往连接的“管道”,另一方随时可读取(只要管道中有发向这一方的数据)。
可以看出,这种“长连接”方式的数据传输和读取是即时的,在前后端交互时,连接只需建立一次,就可实现数据即时的来回传输。而这种连接的一方就称为socket。

实现

  • go实现socket用到了包:golang.org/x,本地没有时可以通过go get的方式拉下来:go get golang.org/x。
  • 下面给出socket连接中客户端和服务端的完整代码,注释中,笔者总结了许多实践中的经验和坑,分享给大家

server

package main

import (
    "golang.org/x/net/websocket"
    "fmt"
    "time"
    "net/http"
)

//socket handler
//todo socket读写有2种方式
//todo 方式1. websocket.Message.Receive(conn, 数据接收体)/websocket.Message.Send(conn, 数据接收体)
//todo 方式2. conn.Read(数据接收体)/conn.Write(数据接收体)

//方式1
func Handler1(conn *websocket.Conn) {
    //打印客户端和服务端地址
    fmt.Printf("a new socket connection from %s -> %s\n", conn.RemoteAddr().String(), conn.LocalAddr().String())

    //socket读写频率由代码自行控制。这里用了死循环,不断等待接受来自client端的数据。如果不设置循环,只数据传输一次后,程序就
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值