百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

golang实现TCP+序列化协议包

toyiye 2024-06-21 12:00 7 浏览 0 评论

go语言的tcp通信代码还是比较简单的。

服务端:

listen, err := net.Listen("tcp", "0.0.0.0:8888") //tcp监听

defer listen.Close() //延时关闭listen

conn, err := listen.Accept() //等待连接

客户端:

conn, err := net.Dial("tcp", "127.0.0.1:8888") //连接到tcp服务器

收发数据:

conn.Read(buf)

conn.Write(buf)

本文重点不在这里,tcp简单demo参考链接:https://www.cnblogs.com/wind-zhou/p/12945288.html

下面进入正题

已知:有一个TCP服务器,原接口实现都是用C语言实现的,现在需要用go语言实现一个接口中间件。

比如,获取随机数的请求数据包格式如下所示,共28字节。(获取一个长度为16字节的随机数)


[]byte序列化核心就两点:
①向[]byte添加一个大端序的int
binary.BigEndian.PutUint32(sendData, uint32(24))

②向[]byte添加字符串
copy(sendData[8:], []byte("####"))

代码:

 1 package main
 2 
 3 import (
 4     "encoding/binary"
 5     "fmt"
 6     "log"
 7     "net"
 8 )
 9 
10 const REQ_GENRANDOM_APP = 0x2008
11 
12 func main() {
13 
14     //建立TCP连接
15     conn, err := net.Dial("tcp", "192.168.6.130:9166")
16     if err != nil {
17         log.Printf("%d: dial error: %s", 1, err)
18         return
19     }
20     log.Println(1, ":connect to server ok")
21     defer conn.Close()
22 
23     var sendData = make([]byte, 28)
24 
25     //以大端序写入总包长()
26     binary.BigEndian.PutUint32(sendData, uint32(24))
27     //写入appid字符串
28     copy(sendData[4:], []byte("1"))
29     copy(sendData[8:], "####")
30     //写入消息类型
31     binary.BigEndian.PutUint32(sendData[12:], uint32(REQ_GENRANDOM_APP))
32     binary.BigEndian.PutUint32(sendData[16:], uint32(0))
33     binary.BigEndian.PutUint32(sendData[20:], uint32(4))
34     //写入随机数长度
35     binary.BigEndian.PutUint32(sendData[24:], uint32(16))
36     fmt.Println("sendData", sendData)
37 
38     //发送数据
39     rv, _ := conn.Write(sendData)
40     fmt.Println("sendLen: ", rv)
41 
42     var recvData = make([]byte, 128)
43     //接收数据
44     recvLen, _ := conn.Read(recvData)
45     fmt.Println("recvLen: ", recvLen)
46     fmt.Println("recvData", recvData[:recvLen])
47 
48     return
49 
50 }

成功连接到服务器,并获得16字节的随机数:

补充:还有一种序列化数据包的方法,是通过bytes.Buffer去做的,也挺好用的。

 1 import (
 2     "bytes"
 3     "encoding/binary"
 4     "fmt"
 5     "log"
 6 )
 7 
 8 func main(){
 9     //序列化
10     var dataA uint64=6010
11     var buffer bytes.Buffer
12     err1 := binary.Write(&buffer, binary.BigEndian, &dataA)
13     if err1!=nil{
14         log.Panic(err1)
15     }
16     byteA:=buffer.Bytes()
17     fmt.Println("序列化后:",byteA)
18 
19     //反序列化
20     var dataB uint64
21     var byteB []byte=byteA
22     err2:=binary.Read(bytes.NewReader(byteB),binary.BigEndian,&dataB)
23     if err2!=nil{
24         log.Panic(err2)
25     }
26     fmt.Println("反序列化后:",dataB)
27 }

相关推荐

「linux专栏」top命令用法详解,再也不怕看不懂top了

在linux系统中,我们经常使用到的一个命令就是top,它主要是用来显示系统运行中所有的进程和进程对应资源的使用等信息,所有的用户都可以使用top命令。top命令内容量丰富,可令使用者头疼的是无法全部...

Linux 中借助 perf 对 php 程序模拟CPU高的案例分析

导语本文是一篇Linux借助工具分析CPU高的优化案例,没有任何干货内容,很详细的展示了优化CPU高的具体步骤,非常适合初中级读者阅读!...

centos漏洞处理方法(centos podman)

centos服务器最近有诸多漏洞,修复命令及对应的漏洞整理后,分享给大家RHSA-2020:1176-低危:avahi安全更新yumupdateavahi-libsRHSA-2017:326...

Linux上的free命令详解(Buffer和Cache)

解释一下Linux上free命令的输出。下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(FreeOutput)。例如:FO[2][1]...

linux 命令行之你真的会用吗?--free 基本用法篇

free命令行统计内存使用率及swap交换分区的使用率数据。是由sourceforge负责维护的,在ubuntu上其包名为procps,这个源码包中,除了free还有ps,top,vmstat,ki...

kong api gateway 初体验(konga github)

kongapigateway初体验(firstsight?)。Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTfulAPI的前面,并通过插件...

在Ubuntu下开启IP转发的方法(ubuntu20 ip)

IP地址分为公有ip地址和私有ip地址,PublicAddress是由INIC(internetnetworkinformationcenter)负责的,这些IP地址分配给了注册并向INIC提...

基于 Kubernetes 的 Serverless PaaS 稳定性建设万字总结

作者:许成铭(竞霄)数字经济的今天,云计算俨然已经作为基础设施融入到人们的日常生活中,稳定性作为云产品的基本要求,研发人员的技术底线,其不仅仅是文档里承诺的几个九的SLA数字,更是与客户切身利益乃...

跟老韩学Ubuntu Linux系列-sysctl 帮助文档

sysctl一般用于基于内核级别的系统调优,man帮助手册如下。...

如何在 Linux/Unix/Windows 中发现隐藏的进程和端口

unhide是一个小巧的网络取证工具,能够发现那些借助rootkit、LKM及其它技术隐藏的进程和TCP/UDP端口。这个工具在Linux、UNIX类、MS-Windows等操作系统下都...

跟老韩学Ubuntu Server 2204-Linux性能管理-uptime指令帮助手册

uptime指令是每个从事Linux系统工作的相关同学必知必会的指令之一,如下是uptime指令的帮助手册。UPTIME(1)...

Openwrt+Rclone+emby+KODI搭建完美家庭影音服务器

特别声明:本篇内容参考了波仔分享,在此表示感谢!上一篇《Openwrt+emby+KODI搭建家庭影音服务器》只适用影音下载到本地的情形,不能播放云盘中的影音,内容较少,缺少了趣味性,也不直观。...

Linux Shell脚本经典案例(linux shell脚本例子)

编写Shell过程中注意事项:开头加解释器:#!/bin/bash语法缩进,使用四个空格;多加注释说明。命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。默认变量是全局的,在函数...

解决 Linux 性能瓶颈的黄金 60 秒

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。...

跟老韩学Ubuntu Server 2204-Linux性能管理-vmstat指令帮助手册

vmstat可查看ubuntlinux的综合性能,是每个从事Linux人员必知必会、需掌握的核心指令之一。vmstat指令帮助手册如下。VMSTAT(8)...

取消回复欢迎 发表评论:

请填写验证码