4.网络编程-websocket(golang)

news2024/11/29 12:52:28

目录

什么是websocket

golang中使用websocket

Server端

Client端 


什么是websocket

WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实时性、长连接方面存在的不足。

以下是WebSocket的主要特点和工作方式:

  1. 双向通信:不同于HTTP请求-响应模式的单向通信,WebSocket允许服务器和浏览器(或客户端)都能发起数据传输,实现实时的数据交互。

  2. 持久连接:一旦WebSocket握手成功建立,浏览器和服务器之间会保持一个持续打开的TCP连接,无需为每个数据包都重新建立连接。

  3. 基于TCP:WebSocket协议是基于TCP的,确保了数据可靠传输。

  4. 轻量级协议:虽然WebSocket握手阶段借用了一些HTTP的概念,但随后的数据传输则采用专有的简洁二进制帧格式,有效减少了头部开销,更适合实时通信场景。

  5. 事件驱动:WebSocket API是事件驱动的,开发者可以通过监听各种事件(如open、message、error、close)来处理连接状态变化和数据接收。

  6. 低延迟:由于避免了HTTP的“请求-响应”循环,WebSocket能够减少不必要的延迟,对于实时聊天、游戏、股票报价、协同编辑等应用场景尤为适用。

WebSocket的工作流程始于一次特殊的HTTP请求,通过升级协议(Upgrade)头信息,客户端请求将HTTP连接转换为WebSocket连接。如果服务器同意升级,那么双方就进入WebSocket协议的通信阶段,直至连接关闭为止。

golang中使用websocket

在Go语言中使用WebSocket,您可以使用第三方库如github.com/gorilla/websocket来实现。以下是一个基本的WebSocket服务器端和客户端示例:

go get -u github.com/gorilla/websocket

Server端

package main

import (
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true // 允许所有源,生产环境中应根据需要设置更严格的CORS策略
	},
}

func serveWs(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("Failed to set up WebSocket connection:", err)
		return
	}
	defer conn.Close()

	for {
		// 读取客户端发送的消息
		msgType, msg, err := conn.ReadMessage()
		if err != nil {
			log.Println("Failed to read WebSocket message:", err)
			break
		}

		log.Printf("Received message from client: %s", msg)

		// 假设我们只是简单地将接收到的消息回传给客户端
		err = conn.WriteMessage(msgType, msg)
		if err != nil {
			log.Println("Failed to send WebSocket message:", err)
			break
		}
	}
}

func main() {
	http.HandleFunc("/ws", serveWs)
	log.Println("Starting WebSocket server on :8080...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("Error starting server:", err)
	}
}

Client端 

package main

import (
	"github.com/gorilla/websocket"
	"log"
	"net/url"
)

func main() {
	u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
	log.Printf("Connecting to %s", u.String())

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("Failed to connect to WebSocket server:", err)
	}
	defer c.Close()

	err = c.WriteMessage(websocket.TextMessage, []byte("Hello from client!"))
	if err != nil {
		log.Println("Failed to send message:", err)
		return
	}

	_, msg, err := c.ReadMessage()
	if err != nil {
		log.Println("Failed to receive message:", err)
		return
	}

	log.Printf("Received message from server: %s", msg)
}

在这个简单的示例中,服务器端创建了一个WebSocket升级器(upgrader),用于将HTTP请求升级为WebSocket连接。当客户端连接到/ws端点时,服务器端会创建一个新的WebSocket连接并进入一个无限循环,不断地读取客户端发送的消息并将其回传给客户端。

客户端则使用默认的Dialer连接到服务器,发送一条消息("Hello from client!"),然后接收并打印来自服务器的回复。在实际应用中,您需要根据需求扩展和定制这些基础功能,例如处理不同类型的WebSocket消息、实现消息广播、连接管理等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 之 【类与对象】从入门到精通一条龙服务 入门篇

不要觉的自己很没用,其实你还可以给家人带来温暖,比如爸妈看到你就来火 目录: 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 1.访问限定符 2.封装 五、类的作用域 六、类的实例化 七、类的…

违法解除劳动合同——典型案例

目录 什么是违法解除劳动合同? 用人单位负举证责任 典型案例 案例:指导案例180号——违法解除劳动合同 案例:浙江省杭州市中级⼈⺠法院——违纪案例 案例:浙江省杭州市中级⼈⺠法院——违纪案例(不服从工作安排) 案例&#…

算法-数论-蓝桥杯

算法-数论 1、最大公约数 def gcd(a,b):if b 0:return areturn gcd(b, a%b) # a和b的最大公约数等于b与a mod b 的最大公约数def gcd(a,b):while b ! 0:cur aa bb cur%bpassreturn a欧几里得算法 a可以表示成a kb r(a,b,k&#xff0c…

13 Python进阶:pip及其他常用模块

pip 是 Python 包管理工具,它提供了对 Python 包的查找、下载、安装、卸载的功能。 包地址: https://pypi.org/ 最新的 Python 版本已经预装了 pip。 pip 各种命令 查看是否已经安装 pip 可以使用以下命令: pip --version下载安装包使用…

Mysql底层原理十一:Mvcc

为什么要mvcc? 提高并发度,如果读和写都是通过加锁的方式,并发肯定上不来,通过mvcc来实现写通过加锁,读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍,页面中的记录存放在用户表空间的数据页中&a…

并发编程之Java中Selector

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Selector提供选择执…

【Web】CTFSHOW-2023CISCN国赛初赛刷题记录(全)

目录 Unzip BackendService go_session deserbug 主打一个精简 Unzip 进来先是一个文件上传界面 右键查看源码,actionupload.php 直接访问/upload.php,看到后端的源码 就是上传一个压缩包,对其进行解包处理 因为其是在/tmp下执行…

MySQL redo log和binlog的区别

redo log和binlog的区别 Redo Log(重做日志): 作用: Redo Log是InnoDB存储引擎特有的一种日志,用于确保数据库的事务持久性和恢复能力。 特点: 存储在InnoDB的数据文件中,而不是作为单独的日志…

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线,选择模板 2.添加流水线源,及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试,这个步骤可以不用动它. 4. …

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为:封装、继承、多态。 封装就是将接口实现统一化,隐藏那些不同的地方,在上层函数调用体现的方式一样,如各种容器的迭代器iterator,尽管底层实现的方式不同,但是在使用…

Java学习笔记23(面向对象三大特征)

1.5 多态 ​ *多态(polymorphic) ​ *方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的 1.多态的具体体现 1.方法的多态 (重写和重载体现了多态) 2.对象的多态 ​ 1.一个对象的编译类型和…

亮数据----教你轻松获取数据

文章目录 1. 数据采集遇到的瓶颈1.1 不会造数据?1.2 不会写爬虫代码? 2.IP 代理基础知识2.1 基本概念2.2 作用和分类2.3 IP 代理的配置和使用2.4 安全和合规 3. 为何使用亮数据 IP 代理3.1 拥有丰富的代理网络服务3.2 简单易操作的采集工具3.3 拥有各平台…

爬虫入狱笔记——xx政府网站公开政策数据

最近在学习爬虫,做个笔记吧 今天爬xx政府网站-政策法规栏目的数据 咱们首先需要找到数据从哪里来,鼠标右键->检查(或者快捷键一般为F12)检查元素,搜索关键词 eg.【违法案例】 回车, 如果没有的话&am…

「媒体邀约」天津媒体邀约资源有哪些?媒体宣传现场报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 天津作为中国北方的重要城市,拥有丰富的媒体资源,可以为各类活动提供全面的媒体宣传和现场报道。以下是天津地区的媒体邀约资源: 1. 报纸媒体 - 《天…

「38」LUT在直播间调色的高级应用……

「38」LUT滤镜 对人或物进行精进调色 OBS软件中的LUT(Look Up Table)滤镜,可用于调整视频、图像的色彩和对比度等效果,以实现专业级的颜色调整需求。 左图为原图 右图为LUT 先对比上面的两张图,用了滤镜效果的变化…

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接: https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图: 3.未升级前 mellanox 网卡驱动版本如下: 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

基于单片机电动自行车太阳能充电系统设计

**单片机设计介绍,基于单片机电动自行车太阳能充电系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的电动自行车太阳能充电系统设计,是一个将太阳能技术与电动自行车充电技术相结合的创…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0,参考上一篇文章: L…

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…

「媒体宣传」科技IT行业有哪些媒体邀约资源-51媒体网

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 科技IT行业的媒体邀约资源非常丰富&#xff0c;包括了各种类型的传统媒体和新兴的网络媒体平台。以下是一些主要的媒体邀约资源&#xff1a; 除此之外&#xff0c;还有一些其他科技类网络…