Go实现网络通信
Go 语言提供了强大的网络编程能力,包括 TCP、UDP、HTTP、WebSocket 等协议的支持。下面是 Go 语言中常用的网络操作:
TCP 通信
使用 net 包进行 TCP 通信,可以创建 TCP 客户端和服务器。
客户端使用 net.Dial 方法连接到指定的 TCP 地址,并使用返回的连接对象进行通信。
服务器使用 net.Listen 方法监听指定的 TCP 地址,接受客户端连接,并使用返回的连接对象进行通信。
TCP 客户端
package mainimport ("fmt""net"
)func main() {// 连接到 TCP 服务器conn, err := net.Dial("tcp", "localhost:8080")if err != nil {fmt.Println("无法连接到服务器:", err)return}defer conn.Close()// 发送数据message := "Hello, TCP server!"_, err = conn.Write([]byte(message))if err != nil {fmt.Println("发送数据失败:", err)return}// 接收服务器响应buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {fmt.Println("接收响应失败:", err)return}fmt.Println("服务器响应:", string(buffer[:n]))
}
TCP 服务器
package mainimport ("fmt""net"
)func main() {// 监听 TCP 连接listener, err := net.Listen("tcp", "localhost:8080")if err != nil {fmt.Println("无法监听端口:", err)return}defer listener.Close()fmt.Println("等待客户端连接...")for {// 接受客户端连接conn, err := listener.Accept()if err != nil {fmt.Println("接受连接失败:", err)continue}// 处理客户端请求go handleClient(conn)}
}func handleClient(conn net.Conn) {defer conn.Close()// 接收客户端数据buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {fmt.Println("读取数据失败:", err)return}fmt.Println("接收到客户端数据:", string(buffer[:n]))// 发送响应给客户端response := "Hello, TCP client!"_, err = conn.Write([]byte(response))if err != nil {fmt.Println("发送响应失败:", err)return}
}
UDP 通信
使用 net 包进行 UDP 通信,可以创建 UDP 客户端和服务器。
客户端使用 net.DialUDP 方法连接到指定的 UDP 地址,并使用返回的连接对象进行通信。
服务器使用 net.ListenUDP 方法监听指定的 UDP 地址,接收客户端发送的数据,并使用返回的连接对象进行通信。
UDP 客户端
package mainimport ("fmt""net"
)func main() {// 连接到 UDP 服务器conn, err := net.Dial("udp", "localhost:8080")if err != nil {fmt.Println("无法连接到服务器:", err)return}defer conn.Close()// 发送数据message := "Hello, UDP server!"_, err = conn.Write([]byte(message))if err != nil {fmt.Println("发送数据失败:", err)return}
}
UDP 服务器
package mainimport ("fmt""net"
)func main() {// 监听 UDP 连接addr, err := net.ResolveUDPAddr("udp", "localhost:8080")if err != nil {fmt.Println("无法解析地址:", err)return}conn, err := net.ListenUDP("udp", addr)if err != nil {fmt.Println("无法监听端口:", err)return}defer conn.Close()fmt.Println("等待客户端连接...")// 接收客户端数据buffer := make([]byte, 1024)n, addr, err := conn.ReadFromUDP(buffer)if err != nil {fmt.Println("读取数据失败:", err)return}fmt.Println("接收到客户端数据:", string(buffer[:n]))// 发送响应给客户端response := "Hello, UDP client!"_, err = conn.WriteToUDP([]byte(response), addr)if err != nil {fmt.Println("发送响应失败:", err)return}
}
HTTP通信
HTTP 客户端
使用 net/http 包进行 HTTP 客户端编程,可以发送 HTTP 请求并接收响应。
使用 http.Get、http.Post 等方法发送不同类型的 HTTP 请求。
可以通过设置请求头、请求方法、请求体等来定制请求,并使用响应对象获取服务器的响应数据。
- 发起 HTTP GET 请求:
package mainimport ("fmt""io/ioutil""net/http"
)func main() {// 发送 GET 请求response, err := http.Get("http://localhost:8080")if err != nil {fmt.Println("发送请求失败:", err)return}defer response.Body.Close()// 读取响应内容body, err := ioutil.ReadAll(response.Body)if err != nil {fmt.Println("读取响应失败:", err)
return}fmt.Println("服务器响应:", string(body))
}
- 发起 HTTP POST 请求:
package mainimport ("bytes""fmt""net/http""io/ioutil"
)func main() {url := "https://jsonplaceholder.typicode.com/posts" // 要发送 POST 请求的网址payload := []byte(`{"title": "foo", "body": "bar", "userId": 1}`)resp, err := http.Post(url, "application/json", bytes.NewBuffer(payload))if err != nil {fmt.Println("HTTP POST 请求失败:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("读取响应体失败:", err)return}fmt.Println("POST 响应:", string(body))
}
- 发起 HTTP PUT 请求:
package mainimport ("bytes""fmt""net/http""io/ioutil"
)func main() {url := "https://jsonplaceholder.typicode.com/posts/1" // 要更新的资源网址payload := []byte(`{"id": 1, "title": "foo", "body": "bar", "userId": 1}`)req, err := http.NewRequest("PUT", url, bytes.NewBuffer(payload))req.Header.Set("Content-Type", "application/json")client := &http.Client{}resp, err := client.Do(req)if err != nil {fmt.Println("HTTP PUT 请求失败:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("读取响应体失败:", err)return}fmt.Println("PUT 响应:", string(body))
}
HTTP 服务器
使用 net/http 包进行 HTTP 服务器编程,可以创建一个 HTTP 服务器来处理客户端的请求。
使用 http.HandleFunc 方法来注册处理不同路由的处理函数,或者使用自定义的 http.Handler 对象处理请求。
可以通过设置路由和处理逻辑来实现 RESTful API、静态文件服务等功能。
package mainimport ("fmt""net/http"
)func main() {// 注册处理函数http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprint(w, "Hello, HTTP client!")})// 启动 HTTP 服务器err := http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("启动服务器失败:", err)return}
}
WebSocket 通信
使用 net/http 包进行 WebSocket 通信,可以创建一个 WebSocket 服务器和客户端。
服务器可以使用 http.HandleFunc 方法来注册 WebSocket 的处理函数,处理客户端的连接和消息。
客户端可以使用 gorilla/websocket 等第三方库来建立 WebSocket 连接,并进行消息的发送和接收。
WebSocket 服务器
package mainimport ("fmt""log""net/http""github.com/gorilla/websocket"
)func main() {// 注册 WebSocket 处理函数http.HandleFunc("/", handleWebSocket)// 启动 WebSocket 服务器err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("启动服务器失败:", err)}
}func handleWebSocket(w http.ResponseWriter, r *http.Request) {// 升级 HTTP 连接为 WebSocket 连接upgrader := websocket.Upgrader{}conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println("升级连接失败:", err)return}defer conn.Close()fmt.Println("客户端已连接")// 处理 WebSocket 消息for {// 读取消息_, message, err := conn.ReadMessage()if err != nil {log.Println("读取消息失败:", err)break}fmt.Println("接收到消息:", string(message))// 发送消息err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, WebSocket client!"))if err != nil {log.Println("发送消息失败:", err)break}}fmt.Println("客户端已断开连接")
}
WebSocket 客户端(使用 JavaScript)
const socket = new WebSocket("ws://localhost:8080");// 连接建立时触发
socket.onopen = function() {console.log("连接已建立");// 发送消息socket.send("Hello, WebSocket server!");
};// 接收消息时触发
socket.onmessage = function(event) {console.log("接收到消息:", event.data);
};// 连接关闭时触发
socket.onclose = function(event) {console.log("连接已关闭");
};
相关文章:
Go实现网络通信
Go 语言提供了强大的网络编程能力,包括 TCP、UDP、HTTP、WebSocket 等协议的支持。下面是 Go 语言中常用的网络操作: TCP 通信 使用 net 包进行 TCP 通信,可以创建 TCP 客户端和服务器。 客户端使用 net.Dial 方法连接到指定的 TCP 地址&am…...
在antd里面渲染MarkDown并且自定义一个锚点目录TOC(重点解决导航目录不跟随文档滚动的问题)
一、整体思路 由于有很多很长的文档需要渲染,我觉得用MarkDown的方式会比较适合管理,所以这两天测试了一下在antd里面集成MarkDown的渲染模块。 总体思路参考: https://blog.csdn.net/Sakuraaaa_/article/details/128400497 感恩大佬的倾情付…...
Linux MMC子系统 - 2.eMMC 5.1总线协议浅析
By: Ailson Jack Date: 2023.10.27 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/161.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…...
时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测
时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM自…...
【Linux】部署单机OA项目及搭建spa前后端分离项目
目录 部署OA项目 编辑 搭建spa前后端分离项目 后端 前端 配置坏境变量 部署OA项目 在虚拟机中,将项目打包成war文件放置到tomcat根目录下的webapps文件目录下 再在主机数据库中连接数据库,并定义数据库名导入相关的表 继续进入tomcat目录下双击点…...
2023中国计算机大会:蚂蚁集团连发两支百万级科研基金
10月26日,中国计算机学会(CCF)主办的第二十届中国计算机大会(CNCC2023)在沈阳举行。在“CCF-蚂蚁科研基金及产学研合作交流活动”上,蚂蚁集团发布了2023年度“CCF-蚂蚁科研基金”绿色计算及隐私计算两支百万级专项基金,…...
Knife4j使用教程(三) -- 实体类的配置注解(@ApiModel与@ApiModelProperty 的 认识与使用)
目录 1. @ApiModel与@ApiModelProperty的区分 2. @ApiModel注解 3. @ApiModelProperty注解 3.1 value属性 3.2 name属性...
计算机网络【CN】IPV4报文格式
版本(4bit):IPV4/IPV6首部长度(4bit):标识首部的长度 单位是4B最小为:20B最大为:60(15*4)B总长度(16bit):整个数据报&…...
SQL server数据库单用户模式如何退出
根据网上的说法,用下面的方式尝试即可退出 进入ssms数据库管理软件执行下面的sql语句 -- 第一步执行USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO--建一个存储过程,断开所有用户连接。 create proc [dbo].[killspid] (dbn…...
QT mqtt 在子线程中使用
qtmqtt 在子线程中使用_qt在子线程里mqtt无法new-CSDN博客文章浏览阅读524次。解决问题:QMqttClient - connection not made from another thread在qt中使用多线的qtmqtt客户端发送接收数据_qt在子线程里mqtt无法newhttps://blog.csdn.net/qq_35708970/article/deta…...
Tomcat运维以及优化
Tomcat常用运维命令 # 查看版本/opt/data/app/tomcat-9.0.82/bin/catalina.sh version## 启动 /opt/data/app/tomcat-9.0.82/bin/startup.sh # 停止 /opt/data/app/tomcat-9.0.82/bin/shutdown.sh调整JVM 参数 方式1 vim /opt/data/app/tomcat-9.0.82/bin/catalina.sh # OS…...
C++设计模式_14_Facade门面模式
本篇介绍的Facade门面模式属于“接口隔离”模式的一种,以下进行详细介绍。 文章目录 1. “接口隔离”模式1. 1 典型模式 2. 系统间耦合的复杂度3. 动机(Motivation)4. 模式定义5. Facade门面模式的代码实现6. 结构7. 要点总结8. 其他参考 1. “接口隔离”模式 在组…...
正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563
上一章学习了STM32MP1内置RTC外设,了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了,而且成本也低,但是在一些对于时间精度要求比较高的场合,SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…...
自动驾驶感知算法面经(20+)
原文链接: https://zhuanlan.zhihu.com/p/656952371 本人2022年4月和2023年7月两次跳槽找工作,面经总结在这里,希望可以帮到需要的朋友。 项目相关的问题主要和经历有关,参考性不大。 2023年7月 1. 文远知行 自动标注算法岗位 项目经历问…...
计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
第二章 进程管理 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第二章 进程管理 【期末复习|考研复习】前言二、进程管理2.1进…...
如何学好C++?学习C和C++的技巧是什么?
如何学好C?学习C和C的技巧是什么? 你这三个问题,前两个都是意思是差不多的,那么怎么怎么学习C/C我来问答一下:最近很多小伙伴找我,说想要一些C资料,然后我根据自己从业十年经验,熬夜搞了几个通…...
leetcode_39 组合总和
1. 题意 给定一个数组,和一个目标值;求得所有数组中所有和为目标值的元素序列。 组合总数 2. 题解 回溯列举每一个可能的序列,注意去重。 2.1 我的解法 class Solution { public:void gen(vector<vector<int>> &ans,co…...
【登录安全测试】
登录安全测试是确保系统的用户身份验证机制和登录过程的安全性的重要步骤。以下是一些常见的登录安全测试方面的考虑: 账号密码验证:验证系统是否能有效地验证用户的账号和密码,包括对密码长度、复杂性和有效性的限制。测试应包括正常和异常…...
MySQL -- 数据类型
MySQL – 数据类型 文章目录 MySQL -- 数据类型一、数据类型1.数据类型分类2.数值类型2.1.tinyint2.2.bit2.3小数类型 3.字符串类型3.1.char3.2.varchar 4.时间和日期类型5.enum和set 一、数据类型 1.数据类型分类 2.数值类型 2.1.tinyint tinyint类型的数值范围是-128 ~ 127…...
Windows11搭建kafka-python环境
文章目录 安装软件javazookeeperkafka命令行调试环境python-kafka环境参数解释名词解释定义基础架构同步发送、异步发送消息队列的两种模式消费者与消费组幂等性文件清理策略kafka消费模式offset作用kafka消费顺序如何保证参考文献安装软件 java 下载jdk,配置环境变量JAVA_H…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
