当前位置: 首页 > news >正文

无框架Java转go语言写http与tcp请求

项目地址

https://github.com/cmdch2017/http_tcpServer

项目结构

在这里插入图片描述

如何快速上手

http篇

1、controller包就相当于@RestController,这里返回了一个Person对象,当你需要新建一个接口时,再新写一个func仿照下面的方法就行了

package controllerimport ("net/http""testproject12/common""testproject12/entity""testproject12/util"
)// PersonHandler 无入参,返回person类
func PersonHandler(w http.ResponseWriter, r *http.Request) {// 创建一个Person对象person := entity.Person{Name:  "John Doe",Age:   30,Title: "Software Engineer",}messageHex := "FFFFFF"util.SendHexMessageToAllUser(messageHex)// 封装为JSON格式的CommonResult并写入响应体common.WriteJSONResponse(w, http.StatusOK, common.DefaultSuccessMsg, person)
}

2、router.go负责配置路由,下面的代码中,server.AddRoute的key相当于@RequestMapping(“/person”),value是上面文件在controller包下,方法是PersonHandler

package routerimport ("testproject12/controller""testproject12/httpServer"
)func SetupRoutes(server *httpServer.HTTPServer) {// 添加路由server.AddRoute("/person", controller.PersonHandler)// Add more routes as needed
}

在这里插入图片描述

tcp篇

用SocketTool新建一个客户端
在这里插入图片描述
在这里插入图片描述
http://localhost:8080/person
在这里插入图片描述
服务器收到数据FFFFFF
在这里插入图片描述

总结

实现了http请求与tcp请求,如果有需要的话请fork我的github代码

性能

在这里插入图片描述

附录

完整代码

package commonimport ("encoding/json""fmt""net/http"
)// Constants for CommonResult keys
const (CodeTag = "code"MsgTag  = "msg"DataTag = "data"
)// Default success and failure messages
const (DefaultSuccessMsg = "操作成功"DefaultFailedMsg  = "操作失败"
)// CommonResult creates a new CommonResult object with the given code and message
func CommonResult(code int, msg string) map[string]interface{} {return map[string]interface{}{CodeTag: code,MsgTag:  msg,}
}func CommonResultWithData(code int, msg string, data interface{}) map[string]interface{} {result := CommonResult(code, msg)if data != nil {result[DataTag] = data}return result
}// Success returns a CommonResult representing success with an optional data payload
func Success(data ...interface{}) map[string]interface{} {result := CommonResult(HttpStatusSuccess, DefaultSuccessMsg)if len(data) > 0 {result[DataTag] = data[0]}return result
}// Error returns a CommonResult representing an error with an optional data payload
func Error(msg string, data ...interface{}) map[string]interface{} {result := CommonResult(HttpStatusError, msg)if len(data) > 0 {result[DataTag] = data[0]}return result
}// HttpStatus constants
const (HttpStatusSuccess = iotaHttpStatusError
)func WriteJSONResponse(w http.ResponseWriter, code int, msg string, data interface{}) {// 创建一个CommonResult并将数据放入其中result := CommonResultWithData(code, msg, data)// 将CommonResult对象序列化为JSON格式的字符串resultData, err := json.Marshal(result)if err != nil {fmt.Println("json格式化错误")http.Error(w, "Internal Server Error", http.StatusInternalServerError)return}// 设置响应头为JSON格式w.Header().Set("Content-Type", "application/json")// 将JSON数据写入响应体w.Write(resultData)
}
package controllerimport ("net/http""testproject12/common""testproject12/entity""testproject12/util"
)// PersonHandler 无入参,返回person类
func PersonHandler(w http.ResponseWriter, r *http.Request) {// 创建一个Person对象person := entity.Person{Name:  "John Doe",Age:   30,Title: "Software Engineer",}messageHex := "FFFFFF"util.SendHexMessageToAllUser(messageHex)// 封装为JSON格式的CommonResult并写入响应体common.WriteJSONResponse(w, http.StatusOK, common.DefaultSuccessMsg, person)
}
package entityimport "net"type ClientInfo struct {Conn net.Conn
}
package entitytype Person struct {Name  string `json:"name"`Age   int    `json:"age"`Title string `json:"title"`
}
package httpServerimport ("fmt""net/http"
)// HTTPServer represents an HTTP tcpserver
type HTTPServer struct {routes map[string]http.HandlerFunc
}// NewHTTPServer creates a new HTTPServer instance
func NewHTTPServer() *HTTPServer {return &HTTPServer{routes: make(map[string]http.HandlerFunc),}
}// AddRoute adds a new route to the HTTP tcpserver
func (s *HTTPServer) AddRoute(path string, handler http.HandlerFunc) {s.routes[path] = handler
}// RunHTTPServer starts the HTTP tcpserver and sets up the routes
func (s *HTTPServer) RunHTTPServer() {for path, handler := range s.routes {// 添加http路由http.HandleFunc(path, handler)}err := http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("HTTP服务器启动失败:", err)}
}
package mainimport ("testproject12/httpServer""testproject12/router""testproject12/tcpserver"
)func main() {// 创建并运行TCP服务器go tcpserver.NewServer().RunTCPServer()// 创建HTTP服务器httpserver := httpServer.NewHTTPServer()// 设置路由router.SetupRoutes(httpserver)// 启动HTTP服务器go httpserver.RunHTTPServer()select {}
}
package routerimport ("testproject12/controller""testproject12/httpServer"
)func SetupRoutes(server *httpServer.HTTPServer) {// 添加路由server.AddRoute("/person", controller.PersonHandler)// Add more routes as needed
}
package tcpserverimport ("encoding/hex""fmt""net""sync""testproject12/entity"
)// 所有用户信息
var AllConnectionList []net.Conn// Server 服务端结构体
type Server struct {Clients map[string]entity.ClientInfoMutex   sync.Mutex
}// NewServer creates a new Server instance
func NewServer() *Server {return &Server{Clients: make(map[string]entity.ClientInfo),}
}
func SendHexMessage(conn net.Conn, hexMessage string) error {messageBytes, err := hex.DecodeString(hexMessage)if err != nil {fmt.Println("转换错误", err)return err}_, err = conn.Write(messageBytes)if err != nil {fmt.Println("发送消息失败", err)return err}return nil
}// RemoveConnection removes a connection from AllConnectionList
func RemoveConnection(conn net.Conn) {for i, c := range AllConnectionList {if c == conn {AllConnectionList = append(AllConnectionList[:i], AllConnectionList[i+1:]...)break}}
}// RunTCPServer starts the TCP tcpserver
func (s *Server) RunTCPServer() {fmt.Println("服务端启动了")listen, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("监听失败", err)return}// 循环等待客户端的连接for {conn, err := listen.Accept()if err != nil {fmt.Println("客户端的等待失败", err)return} else {fmt.Printf("等待连接成功:,con=%v,接受到的客户端信息:%v \n", conn, conn.RemoteAddr().String())// 服务端主动发送消息给客户端messageHex := "48656c6c6f2066726f6d20736572766572" // "Hello from tcpserver" 的十六进制表示SendHexMessage(conn, messageHex)}// 处理客户端连接的协程go s.handleClient(conn)}
}// 处理客户端连接
func (s *Server) handleClient(conn net.Conn) {defer conn.Close()// 获取客户端地址clientAddr := conn.RemoteAddr().String()// 将客户端信息存储到 map 中s.Mutex.Lock()s.Clients[clientAddr] = entity.ClientInfo{Conn: conn, // 存储客户端连接对象}AllConnectionList = append(AllConnectionList, conn)s.Mutex.Unlock()// 处理客户端消息for {buf := make([]byte, 1024)n, err := conn.Read(buf)if err != nil {break}// 处理接收到的消息hexData := hex.EncodeToString(buf[:n])fmt.Println("收到客户端消息:", clientAddr, ":", hexData)}// 客户端断开连接,从 map 中移除该用户s.Mutex.Lock()delete(s.Clients, clientAddr)RemoveConnection(conn)s.Mutex.Unlock()fmt.Println("客户端断开连接:", clientAddr)
}
package utilimport ("encoding/hex""testproject12/tcpserver"
)// SendHexMessage 发送十六进制消息// SendHexMessageToAllUser 广播发送十六进制消息
func SendHexMessageToAllUser(message string) {messageHex := hex.EncodeToString([]byte(message))for _, conn := range tcpserver.AllConnectionList {tcpserver.SendHexMessage(conn, messageHex)}
}

Dockerfile

# Use the official Golang image as the base image
FROM golang:1.21-alpine# Set the working directory inside the container
WORKDIR /go/src/app# Copy the contents of the current directory to the working directory inside the container
COPY . .# Build the Go application
RUN go build -o abc ./main# Add executable permission to the main binary
RUN chmod +x ./abc# Expose the port the application runs on
EXPOSE 8888 8080# Define the command to run the application
CMD ["./abc"]

go.mod

module testproject12go 1.21.4

相关文章:

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController,这里返回了一个Person对象,当你需要新建一个接口时,再新写一个func仿照下面的方法就行了 package control…...

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统,…...

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途,欢迎探讨与指正!! 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…...

【蓝桥杯选拔赛真题52】python空调模式 第十四届青少年组蓝桥杯python 选拔赛比赛真题解析

目录 python空调模式 一、题目要求 1、编程实现 2、输入输出...

Android Studio: 解决Gradle sync failed 错误

文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目,发现新装的AS,在下载gradle的过程中,一直显示连接失败,Gradl…...

【手写数据库】从零开始手写数据库内核,行列混合存储模型,学习大纲成型了

目录 ​专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以…...

机器学习中的一些经典理论定理

PAC学习理论 当使用机器学习方法来解决某个特定问题时,通常靠经验或者多次试验来选择合适的模型、训练样本数量以及学习算法收敛的速度等。但是经验判断或多次试验往往成本比较高,也不太可靠,因此希望有一套理论能够分析问题难度、计算模型能…...

c语言:成本100元,40%的利润怎么计算|练习题

一、利润的计算公式&#xff1a; 利润售价-成本 售价成本/(1-利润率) 二、用c语言代码表示为&#xff1a; 如图&#xff1a; 三、计算源代码【带注释】 #include <stdio.h> int main() { float cost;//成本变量 int prof_rate;//利润率变量 float price;//…...

【Python必做100题】之第二十二题(复制列表)

题目&#xff1a;将一个列表的数据复制到另一个列表中 重点&#xff1a;确保复制到位要导入copy方法进行深度复制 代码如下&#xff1a; #将一个列表的数据复制到另一个列表中 import copy list [1,2,3,4] print(list) list1 copy.copy(list) list[0] 30 print(list) pri…...

Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…...

startUML6.0.1破解方法

startUML6.0.1破解方法 文章目录 startUML6.0.1破解方法1.startUML6.0.1快速破解2.概述3.安装Nodejs4.安装asar5.修改app.asar中的源码6.将修改后的源码重新压缩7.覆盖官方的asar文件8.重启startUML9.参考文档 1.startUML6.0.1快速破解 后绪步骤可以不看&#xff0c;直接下载我…...

Python实现多种图像分割方法:基于阈值分割和基于区域分割

Python实现多种图像分割方法&#xff1a;基于阈值分割和基于区域分割 图像分割是图像分析的第一步&#xff0c;是计算机视觉的基础&#xff0c;但也是图像处理中最困难的问题之一。经典的计算机视觉任务&#xff0c;如目标检测、图像识别等都和图像分割相关&#xff0c;图像分…...

SQL学习笔记+MySQL+SQLyog工具教程

文章目录 1、前言2、SQL基本语言及其操作2.1、CREATE TABLE – 创建表2.2、DROP TABLE – 删除表2.3、INSERT – 插入数据2.4、SELECT – 查询数据2.5、SELECTDISTINCT – 去除重复值后查询数据2.6、SELECTWHERE – 条件过滤2.7、AND & OR – 运算符2.8、ORDER BY – 排序2…...

SpringBoot的日志管理

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…...

leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]

原题&#xff1a;76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 此题在这道题的基础上进行理解会更简单 leetcode --- 30. 串联所有单词的子串[C 滑动窗口/双指针]-CSDN博客 本题要求在s字符串中找到含有t字符串所有字符的最短子串。 也就是…...

Kafka 分级存储在腾讯云的实践与演进

导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享&#xff0c;从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…...

域架构下的功能安全思考

来源&#xff1a;联合电子 随着整车电子电气架构的发展&#xff0c;功能域控架构向整车集中式区域控制演进。新的区域控制架构下&#xff0c;车身控制模块(BCM)&#xff0c;整车控制单元&#xff08;VCU&#xff09;&#xff0c;热管理系统&#xff08;TMS&#xff09;和动力底…...

python多线程介绍

每个库或模块都有其特定的用途和优势&#xff0c;选择哪一个取决于具体的任务需求、计算资源。一般可以将任务分成两类&#xff1a; I/O 密集型任务&#xff1a;这些任务的瓶颈主要在于等待外部操作&#xff0c;如磁盘读写或网络通信。在这些等待期间&#xff0c;CPU 大部分时间…...

征文榜单 | 腾讯云向量数据库获奖名单公布

为了帮助开发者更快、更便捷地构建应用程序&#xff0c;有效提高开发人员生产力&#xff0c;腾讯云推出了AI原生向量数据库。它能提供全托管的自研企业级分布式数据库服务&#xff0c;专用于存储、检索、分析多维向量数据&#xff0c;是国内首个从接入层、计算层、到存储层提供…...

如何预防[[MyFile@waifu.club]].wis [[backup@waifu.club]].wis勒索病毒感染您的计算机?

导言&#xff1a; 近期&#xff0c;一种新兴的威胁[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis勒索病毒&#xff0c;引起了广泛关注。这种恶意软件通过其高度复杂的加密算法&#xff0c;威胁着用户和组织的数据安全。本文将深入介绍[[MyFilewaifu.club]].wis [[backup…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...