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

Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信

目录标题

  • 一、Json序列化与反序列化
    • 1. 序列化
    • 2. 反序列化
  • 二、Goto语法
  • 三、Tcp Socket
    • 1. 单客户端发送信息到服务端
    • 2. 服务端客户端通信

一、Json序列化与反序列化

1. 序列化

		package mainimport ("encoding/json""fmt")type Person struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`}func main() {person := Person{Name:  "LoisMay",Age:   21,Email: "1711031006@qq.com",}// 序列化为 JSON 字节数组jsonData, err := json.Marshal(person)if err != nil {fmt.Println("JSON 序列化错误:", err)return}// 打印 JSON 字符串fmt.Println(string(jsonData))// {"name":"LoisMay","age":21,"email":"1711031006@qq.com"}}

2. 反序列化

		func main() {Data := []byte(`{"name":"LoisMay","age":21,"email":"1711031006@qq.com"}`)// 反序列化为 Person 结构体var person Personerr := json.Unmarshal(Data, &person)if err != nil {fmt.Println("JSON 反序列化错误:", err)return}// 打印反序列化后的对象fmt.Println(person.Name)fmt.Println(person.Age)fmt.Println(person.Email)}

二、Goto语法

        goto 语句可以用来实现程序的无条件跳转但在实际开发中,应该谨慎使用它,因为滥用 goto 可能会导致代码结构混乱和可读性降低。package mainimport "fmt"func main() {var n = 30fmt.Println("LoisMay")if n > 20 {goto func1}fmt.Println("LoisMays")fmt.Println("LoisMayss")fmt.Println("LoisMaysss")func1:fmt.Println("666")fmt.Println("777")fmt.Println("888")}//	LoisMay//	666//	777//	888

三、Tcp Socket

1. 单客户端发送信息到服务端

Server.go

		package mainimport ("bufio""fmt""net""strings")func process(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)for {fmt.Printf("Server is waiting for client message from %s:\n", conn.RemoteAddr().String())massage, err := reader.ReadString('\n')if err != nil {fmt.Printf("Client exited with error: %v\n", err)return}massage = strings.Trim(massage, "\r\n")fmt.Printf("Received message from client: %s\n", massage)// 服务端回复消息response := "Server received: " + massage + "\n"_, err = conn.Write([]byte(response))if err != nil {fmt.Printf("Error sending response to client: %v\n", err)return}}}func main() {fmt.Println("Server is Listen")listen, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Listen err=", err)return}defer listen.Close()for {fmt.Println("Waiting for client connection")conn, err := listen.Accept()if err != nil {fmt.Println("Accept err=", err)} else {fmt.Printf("Accepted connection from client: %v\n", conn.RemoteAddr().String())}go process(conn)}}

Client.go

		package mainimport ("bufio""fmt""net""os""strings")func main() {conn, err := net.Dial("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Client dial error:", err)return}defer conn.Close()reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")message, err := reader.ReadString('\n')if err != nil {fmt.Println("ReadString error:", err)break}message = strings.Trim(message, "\r\n")if message == "exit" {fmt.Println("Client is exiting")break}_, err = conn.Write([]byte(message + "\n"))if err != nil {fmt.Println("Connection write error:", err)break}response, err := bufio.NewReader(conn).ReadString('\n')if err != nil {fmt.Println("Read response error:", err)break}fmt.Println("Server response:", response)}}

2. 服务端客户端通信

server.go

		package mainimport ("bufio""fmt""net""os""strings")func handleClient(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)writer := bufio.NewWriter(conn)for {// 读取客户端消息message, err := reader.ReadString('\n')if err != nil {fmt.Printf("Error reading client message: %v\n", err)return}message = strings.Trim(message, "\r\n")fmt.Printf("Received message from client: %s\n", message)// 回复客户端消息response := "Server received: " + message + "\n"_, err = writer.WriteString(response)if err != nil {fmt.Printf("Error sending response to client: %v\n", err)return}writer.Flush()// 检查客户端是否要退出if message == "exit" {fmt.Println("Client is exiting")return}}}func main() {fmt.Println("Server is listening")listener, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Listen error:", err)return}defer listener.Close()for {fmt.Println("Waiting for client connection")conn, err := listener.Accept()if err != nil {fmt.Println("Accept error:", err)break}fmt.Println("Client connected:", conn.RemoteAddr().String())go handleClient(conn)// 启动一个 goroutine 处理服务端发送消息go func(c net.Conn) {reader := bufio.NewReader(os.Stdin)writer := bufio.NewWriter(c)for {// 从控制台读取输入fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给客户端_, err := writer.WriteString(input + "\n")if err != nil {fmt.Printf("Error sending message to client: %v\n", err)return}writer.Flush()// 检查服务端是否要退出if input == "exit" {fmt.Println("Server is exiting")return}}}(conn)}// 阻塞主线程,使服务端持续运行<-make(chan struct{})}

Client.go

		package mainimport ("bufio""fmt""net""os""strings")func handleServer(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)writer := bufio.NewWriter(conn)for {// 读取服务端消息message, err := reader.ReadString('\n')if err != nil {fmt.Printf("Error reading server message: %v\n", err)return}message = strings.Trim(message, "\r\n")fmt.Printf("Received message from server: %s\n", message)// 检查服务端是否要退出if message == "exit" {fmt.Println("Server is exiting")return}// 从控制台读取输入fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给服务端_, err = writer.WriteString(input + "\n")if err != nil {fmt.Printf("Error sending message to server: %v\n", err)return}writer.Flush()// 检查客户端是否要退出if input == "exit" {fmt.Println("Client is exiting")return}}}func main() {conn, err := net.Dial("tcp", "127.0.0.1:8888")if err != nil {fmt.Println("Client dial error:", err)return}fmt.Println("Connected to server")go handleServer(conn)// 从控制台读取输入reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给服务端_, err = conn.Write([]byte(input + "\n"))if err != nil {fmt.Printf("Error sending message to server: %v\n", err)return}// 检查客户端是否要退出if input == "exit" {fmt.Println("Client is exiting")break}}conn.Close()}

在这里插入图片描述

http://www.lryc.cn/news/227095.html

相关文章:

  • gitlab-ce-12.3.5 挖矿病毒及解决方案
  • 每日一题(LeetCode)----数组--移除元素(四)
  • 421. 数组中两个数的最大异或值/字典树【leetcode】
  • C++(20):自定义类型实现基于范围的for循环
  • Linux常用命令:find、grep、vim、cat、less、more
  • Oracle导入,注意事项
  • 【数据结构】入队序列出队序列问题(以21年408真题举例)
  • 在ant构建脚本中调用maven的命令
  • 美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证
  • Git基础知识学习常用命令一
  • 【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用
  • 云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元
  • [护网杯 2018]easy_tornado 1(两种解法!)
  • 冒泡排序(Bubble Sort)
  • JVM源码剖析之软、弱、虚引用的处理细节
  • Linux服务器上搭建JupyterNotebook教程
  • 记录bug1
  • 【MySQL】rank()、row_number()、dense_rank()用法详解
  • NFT合约部署
  • 【C++】从入门到精通第三弹——友元函数与静态类成员
  • acwing算法基础之搜索与图论--floyd算法
  • Zabbix监控SSL证书有效期
  • Arduino OneButton按键处理库实现单击/双击/长按功能
  • day52 django的下载与安装
  • WebGL智慧城市软件项目
  • VMware重装后没有虚拟网卡
  • 软件安全基础
  • 探索项目管理软件的多重用途和益处
  • Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
  • 【车载开发系列】AutoSar中的CANTP