使用go语言写一个脚本 实现WebSockt连接 用户发送a 得到返回b

在Go语言中实现一个简单的WebSocket服务器,该服务器能够接收客户端发送的“a”并返回“b”,可以按照以下步骤进行。首先,确保你的环境中已经安装了Go语言环境。接下来,你需要安装一个WebSocket库来处理WebSocket连接。这里我们使用`gorilla/websocket`,这是一个非常流行的WebSocket库。

 

### 步骤 1: 安装gorilla/websocket

 

打开命令行,执行以下命令来安装`gorilla/websocket`库:

 

```bash

go get github.com/gorilla/websocket

```

 

### 步骤 2: 创建WebSocket服务器

 

创建一个新的Go文件,例如`main.go`,然后添加以下代码:

 

```go

package main

 

import (

 "fmt"

 "log"

 "net/http"

 

 "github.com/gorilla/websocket"

)

 

var upgrader = websocket.Upgrader{

 // 允许所有来源的连接

 CheckOrigin: func(r *http.Request) bool {

  return true

 },

}

 

func echo(w http.ResponseWriter, r *http.Request) {

 // 升级HTTP连接为WebSocket连接

 conn, err := upgrader.Upgrade(w, r, nil)

 if err != nil {

  log.Print("upgrade:", err)

  return

 }

 defer conn.Close()

 

 for {

  // 读取消息

  msgType, msg, err := conn.ReadMessage()

  if err != nil {

   log.Println("read:", err)

   break

  }

  fmt.Printf("recv: %s\n", msg)

 

  // 检查消息是否为"a",如果是则发送"b"回客户端

  if string(msg) == "a" {

   if err := conn.WriteMessage(msgType, []byte("b")); err != nil {

    log.Println("write:", err)

    break

   }

  }

 }

}

 

func main() {

 http.HandleFunc("/ws", echo)

 fmt.Println("Starting server on :8080")

 if err := http.ListenAndServe(":8080", nil); err != nil {

  log.Fatal("ListenAndServe: ", err)

 }

}

```

 

### 步骤 3: 运行服务器

 

在命令行中,导航到包含`main.go`文件的目录,并运行以下命令启动服务器:

 

```bash

go run main.go

```

 

### 步骤 4: 测试WebSocket服务器

 

你可以使用任何支持WebSocket的客户端工具(如浏览器中的JavaScript、Postman等)来测试这个WebSocket服务器。以下是一个简单的JavaScript示例,用于从浏览器连接到这个WebSocket服务器并发送消息:

 

```html

<!DOCTYPE html>

<html>

<body>

 

<script>

var socket = new WebSocket('ws://localhost:8080/ws');

 

socket.onopen = function(e) {

  console.log("[open] Connection established");

  console.log("Sending to server");

  socket.send("a");

};

 

socket.onmessage = function(event) {

  console.log(`[message] Data received from server: ${event.data}`);

};

 

socket.onclose = function(event) {

  if (event.wasClean) {

    console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);

  } else {

    // e.g. server process killed or network down

    // event.code is usually 1006 in this case

    console.log('[close] Connection died');

  }

};

 

socket.onerror = function(error) {

  console.log(`[error] ${error.message}`);

};

</script>

 

</body>

</html>

```

 

将上述HTML代码保存为一个`.html`文件,然后用浏览器打开它,你应该能在控制台看到与WebSocket服务器的交互信息。如果一切正常,当你发送“a”时,服务器会响应“b”。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt几何数据类型:QLine类型详解(基础向)

QLine类 QLine 是 Qt 提供的一个简单的几何类&#xff0c;适用于整数精度的线段表示&#xff0c;用于表示二维空间中的直线段。它主要用于计算和绘图中的基本几何处理。 如果需要更复杂的功能&#xff08;如角度计算或长度的浮点表示&#xff09;&#xff0c;可以转为 QLineF。…

Ubuntu22.04上kdump和crash的使用

0.前言 1.引用&#xff1a; 解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 ubuntu内核转储分析——kdump和crash的下载和使用_ubuntu kdump-CSDN博客 U…

构建自己的docker的ftp镜像

aarch64系统可运行的docker镜像 构建自己的vsftpd镜像&#xff0c;我是在windows系统下的docker desktop中构建运行于aarch64 GNU/Linux系统的ftp镜像。 系统环境&#xff1a; Welcome to Debian GNU/Linux with Linux x.x.x dockerfile FROM ubuntu:latestUSER rootRUN ap…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

JavaScript(JS)的对象

目录 1.array 数组对象 2.String 字符串对象 3.JSON 对象&#xff08;数据载体&#xff0c;进行数据传输&#xff09; 4.BOM 浏览器对象 5.DOM 文档对象&#xff08;了解&#xff09; 1.array 数组对象 定义方式1&#xff1a;var 变量名 new Array(元素列表); 定义方式…

Cannot resolve symbol ‘ActivityThread‘ | Android 语法

背景 ActivityThread 是 Android 系统内部使用的一个类,它位于 android.app 包中,但在 Android SDK 的公共 API 中并没有公开。 由于 ActivityThread 是隐藏的内部类,因此在编写单元测试或功能开发时,无法直接引用它。可以使用反射来访问内部 API,或者使用依赖注入的方式…

AI论文速读 | TimeXer:让 Transformer能够利用外部变量进行时间序列预测

题目&#xff1a; TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables 作者&#xff1a;Yuxuan Wang ; Haixu Wu&#xff08;吴海旭&#xff09; ; Jiaxiang Dong ; Yong Liu ; Yunzhong Qiu ; Haoran Zhang ; Jianmin Wang&#xff08;…

Zustand的学习和应用

Zustand 是一个轻量级的状态管理库&#xff0c;适用于 React 应用程序。它以简单易用、高性能和无模板代码的特性受到开发者的喜爱。 https://zustand.docs.pmnd.rs/guides/tutorial-tic-tac-toe 以下是 Zustand 的核心特点和用法简介&#xff1a; Zustand 核心特点 轻量简…

【从零开始的LeetCode-算法】3274. 检查棋盘方格颜色是否相同

给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。 坐标总是表示有效的棋盘方格。坐标的格式总是先字母&#xff08;表示列…

常见问题QA的前端代码

这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…

互联网 Java 面试八股文汇总(2025 最新整理)

我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff0c;都…

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5&#xff1a;MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1&#xff1a;这种加密的密文特征跟MD5差不多&#xff0c;只不过位数是40&#xff08;sha256&#xff1a;64位&#xff1b;sha512:128位&#xff09; 3.HMAC&#xff1a;这…

Linux 入门——基本指令2

目录 1. 通配符的使用 1&#xff09;基本使用 2&#xff09; 拓展使用 2. cp 文件拷贝 基本使用 3. mv :文件剪切或者文件重命名 4. more 指令 5. less 指令 6. cat ,more , less 指令的区别 7. head 8. tail 9. date 日期&#xff0c;时间相关的指令 1&…

2024年12月3日Github流行趋势

项目名称&#xff1a;Lobe Chat 项目维护者&#xff1a;arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍&#xff1a;一个开源的、现代化设计的人工智能聊天框架。支持多种AI提供商&#xff08;OpenAI / Claude 3 / Gemini / Ollama / Qwen / De…

vue2+cesium初始化地图

目录 1、在vue2项目中下载cesium 2、安装loader 3、更改vue.config.js中的配置 4、main.js中引入 5、App.vue中设置样式 6、新建map.vue 其中代码如下&#xff1a; 7、在App.vue中使用Map组件 8、效果展示&#xff1a; 1、在vue2项目中下载cesium npm install cesium 可…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类&#xff0c;用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2&#xff08;api8&#xff09;之后新增的一个&#xff0c;该类为…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…