无框架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%的利润怎么计算|练习题
一、利润的计算公式: 利润售价-成本 售价成本/(1-利润率) 二、用c语言代码表示为: 如图: 三、计算源代码【带注释】 #include <stdio.h> int main() { float cost;//成本变量 int prof_rate;//利润率变量 float price;//…...
【Python必做100题】之第二十二题(复制列表)
题目:将一个列表的数据复制到另一个列表中 重点:确保复制到位要导入copy方法进行深度复制 代码如下: #将一个列表的数据复制到另一个列表中 import copy list [1,2,3,4] print(list) list1 copy.copy(list) list[0] 30 print(list) pri…...
Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 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快速破解 后绪步骤可以不看,直接下载我…...
Python实现多种图像分割方法:基于阈值分割和基于区域分割
Python实现多种图像分割方法:基于阈值分割和基于区域分割 图像分割是图像分析的第一步,是计算机视觉的基础,但也是图像处理中最困难的问题之一。经典的计算机视觉任务,如目标检测、图像识别等都和图像分割相关,图像分…...
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的日志管理
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…...
leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]
原题:76. 最小覆盖子串 - 力扣(LeetCode) 题目解析: 此题在这道题的基础上进行理解会更简单 leetcode --- 30. 串联所有单词的子串[C 滑动窗口/双指针]-CSDN博客 本题要求在s字符串中找到含有t字符串所有字符的最短子串。 也就是…...
Kafka 分级存储在腾讯云的实践与演进
导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享,从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…...
域架构下的功能安全思考
来源:联合电子 随着整车电子电气架构的发展,功能域控架构向整车集中式区域控制演进。新的区域控制架构下,车身控制模块(BCM),整车控制单元(VCU),热管理系统(TMS)和动力底…...
python多线程介绍
每个库或模块都有其特定的用途和优势,选择哪一个取决于具体的任务需求、计算资源。一般可以将任务分成两类: I/O 密集型任务:这些任务的瓶颈主要在于等待外部操作,如磁盘读写或网络通信。在这些等待期间,CPU 大部分时间…...
征文榜单 | 腾讯云向量数据库获奖名单公布
为了帮助开发者更快、更便捷地构建应用程序,有效提高开发人员生产力,腾讯云推出了AI原生向量数据库。它能提供全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据,是国内首个从接入层、计算层、到存储层提供…...
如何预防[[MyFile@waifu.club]].wis [[backup@waifu.club]].wis勒索病毒感染您的计算机?
导言: 近期,一种新兴的威胁[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis勒索病毒,引起了广泛关注。这种恶意软件通过其高度复杂的加密算法,威胁着用户和组织的数据安全。本文将深入介绍[[MyFilewaifu.club]].wis [[backup…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
C#中用于控制自定义特性(Attribute)
我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中,Attribute(特性)是一种用于向程序元素(如类、方法、属性等)添加元数据的机制。Attr…...
