C++GO语言socket套接字

news2025/5/13 4:37:20

目录

01 06-socket-client-server通信过程分析

02 07-socket-server-单次处理

03 08-socket-client

01 09-socket-server-多连接建立

02 10-socket-client多次发送数据


01 -socket-client-server通信过程分析

### - Server Demo

接收一个链接,而且只能发送一次数据

```go
package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//创建监听
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d", ip, port)

	//func Listen(network, address string) (Listener, error) {
	//net.Listen("tcp", ":8848") //简写,冒号前面默认是本机: 127.0.0.1
	listener, err := net.Listen("tcp", address)

	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}

	fmt.Println("监听中...")

	//Accept() (Conn, error)
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("listener.Accept err:", err)
		return
	}

	fmt.Println("连接建立成功!")

	//创建一个容器,用于接收读取到的数据
	buf := make([]byte, 1024) //使用make来创建字节切片, byte ==> uint8

	//Read(b []byte) (n int, err error)
	//cnt:真正读取client发来的数据的长度
	cnt, err := conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err:", err)
		return
	}

	fmt.Println("Client =====> Server, 长度:", cnt, ",数据:", string(buf[0:cnt]))

	//服务器对客户端请求进行响应 ,将数据转成大写 "hello" ==> HELLO
	//func ToUpper(s string) string {
	upperData := strings.ToUpper(string(buf[0:cnt]))

	//Write(b []byte) (n int, err error)
	cnt, err = conn.Write([]byte(upperData))
	fmt.Println("Client  <====== Server, 长度:", cnt, ",数据:", upperData)

	//关闭连接
	conn.Close()
}

```

02 -socket-server-单次处理

### - client demo

```go
package main

import (
	"fmt"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", ":8848")
	if err != nil {
		fmt.Println("net.Dial err:", err)
		return
	}

	fmt.Println("cliet与server连接建立成功!")
	sendData := []byte("helloworld")

	//向服务器发送数据
	cnt, err := conn.Write(sendData)
	if err != nil {
		fmt.Println("conn.Write err:", err)
		return
	}

	fmt.Println("Client ===> Server cnt:", cnt, ", data:", string(sendData))

	//接收服务器返回的数据
	//创建buf,用于接收服务器返回的数据
	buf := make([]byte, 1024)
	cnt, err = conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err:", err)
		return
	}

	fmt.Println("Client <==== Server , cnt:", cnt, ", data:", string(buf[0:cnt]))

	conn.Close()
}

```

![1586142435285](assets/1586142435285.png)

![1586142450761](assets/1586142450761.png)



socket-server处理多个连接,每个连接可以接收多次数据

03 -socket-client

socket-server处理多个连接,每个连接可以接收多次数据

```go
package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//创建监听
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d", ip, port)

	//func Listen(network, address string) (Listener, error) {
	//net.Listen("tcp", ":8848") //简写,冒号前面默认是本机: 127.0.0.1
	listener, err := net.Listen("tcp", address)

	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}

	//需求:
	// server可以接收多个连接, ====> 主go程负责监听,子go程负责数据处理
	// 每个连接可以接收处理多轮数据请求

	for {
		fmt.Println("监听中...")

		//Accept() (Conn, error)
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("listener.Accept err:", err)
			return
		}

		fmt.Println("连接建立成功!")

		go handleFunc(conn)
	}
}

//处理具体业务的逻辑,需要将conn传递进来,每一新连接,conn是不同的
func handleFunc(conn net.Conn) {
	for { //这个for循环,保证每一个连接可以多次接收处理客户端请求
		//创建一个容器,用于接收读取到的数据
		buf := make([]byte, 1024) //使用make来创建字节切片, byte ==> uint8

		fmt.Println("准备读取客户端发送的数据....")

		//Read(b []byte) (n int, err error)
		//cnt:真正读取client发来的数据的长度
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("conn.Read err:", err)
			return
		}

		fmt.Println("Client =====> Server, 长度:", cnt, ",数据:", string(buf[0:cnt]))

		//服务器对客户端请求进行响应 ,将数据转成大写 "hello" ==> HELLO
		//func ToUpper(s string) string {
		upperData := strings.ToUpper(string(buf[0:cnt]))

		//Write(b []byte) (n int, err error)
		cnt, err = conn.Write([]byte(upperData))
		fmt.Println("Client  <====== Server, 长度:", cnt, ",数据:", upperData)
	}

	//关闭连接
	_ = conn.Close()
}

```

![1586144266008](assets/1586144266008.png)

04 -socket-server-多连接建立

当client多次发送数据时:

![1586144575298](assets/1586144575298.png)



# 三、http

## 1. 概述

编写web语言:

1. java
2. php, 现在都在尝试使用go语言重写
3. python,豆瓣
4. go语言    ===》 beego,gin两个主流的web框架



https协议:我们使用浏览器访问的时候发送的就是http请求

1. http是应用层的协议,底层还是依赖传输层:tcp(短连接),网络层(ip)

2. 无状态的,每一次请求都是独立的,下次请求需要重新建立连接

3. https:

   1. http是标准协议 ==》 明文传输,不安全

   2. https不是标准协议   ===》 https = http + ssl(非对称加密,数字证书)--》加密的

   3. 现在所有网站都会尽量要求使用https开发:安全

      

## 2. http请求报文格式



![1575433140952](C:/Users/duke/Desktop/00-go语言语法4天(总结好)/day03-socket-http/assets/1575433140952.png)

![1586155308860](assets/1586155308860.png)

05 -socket-client多次发送数据

一个http请求可以分为4部分:

1. 请求行:包含三部分
   1. 格式:  方法   +   URL   + 协议版本号
   2.  实例: POST  +   /chapter17/user   + HTTP/1.1
   3. 请求方法:
      1. GET:获取数据
      2. POST:上传数据(表单格式,json格式)
      3. PUT:修改数据
      4. DELETE: 用于删除数据
2. 请求头
   1. 格式:  key :value
   2. 可以有很多个键值对(包含协议自带,也包含用户自定义的)
   3. 常见重要头:
      1. Accept : 接收数据的格式
      2. User-Agent : 描述用户浏览器的信息
      3. Connection: Keep-Alive (长链接), Close(短连接)
      4. Aceept-Encoding : gzip, xxx  , 描述可以接受的编码
      5. Cookie: 由服务器设置的key=value数据,客户端下次请求的时候可以携带过来
      6. Content-Type: 
         1. appliction/-form(表示上传的数据是表单格式), 
         2. application/json(表示body的数据是json格式)
      7. 用户可以自定义的:
         1. name : Duke
         2. age : 18
3. 空行
   1. 告诉服务器,请求头结束了,用于分割
4. 请求包体(可选的)
   1. 一般在POST方法时,会配套提供BODY
   2. 在GET的时候也可以提供BODY,但是这样容易让人混淆,建议不要这样使用
   3. 上传两种数据格式:
      1. 表单: 姓名,性别,年龄
      2. json数据格式



启动tcp的server案例,使用postman发起http请求,查看http请求头信息:

```go
package main

import (
	"fmt"
	"net"
	"strings"
)

func main() {
	//创建监听
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d", ip, port)

	//func Listen(network, address string) (Listener, error) {
	//net.Listen("tcp", ":8848") //简写,冒号前面默认是本机: 127.0.0.1
	listener, err := net.Listen("tcp", address)

	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}
	fmt.Println("server start ...")

	//需求:
	// server可以接收多个连接, ====> 主go程负责监听,子go程负责数据处理
	// 每个连接可以接收处理多轮数据请求

	for {
		fmt.Println("监听中...")

		//Accept() (Conn, error)
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("listener.Accept err:", err)
			return
		}

		fmt.Println("连接建立成功!")

		go handleFunc(conn)
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket:实时通信的新时代

在现代Web应用中&#xff0c;实时通信变得越来越重要。传统的HTTP协议虽然能够满足基本的请求-响应模式&#xff0c;但在需要频繁更新数据的场景下&#xff0c;其效率和性能显得捉襟见肘。WebSocket协议应运而生&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的机制&a…

IT/OT 融合架构下的工业控制系统安全攻防实战研究

1. 引言 随着工业 4.0 和智能制造的浪潮席卷全球&#xff0c;信息技术 (IT) 与运营技术 (OT) 的融合已成为不可逆转的趋势。这种融合旨在通过实时数据交换和分析&#xff0c;打破传统的信息孤岛&#xff0c;显著提升生产效率、优化决策、降低运营成本并增强市场竞争力。IT 系统…

基于Qt的app开发第六天

写在前面 博主是一个大一下的计科生&#xff0c;现在正在做C面向对象程序设计的课程设计&#xff0c;具体功能可以看本专栏的第一篇博客。 目前的进度是&#xff1a;配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能&#xff0c;即新建…

npm create vite@latest my-vue-app 解读

背景发荧光的样式。 filter属性的学习&#xff1a;filter - CSS&#xff1a;层叠样式表 | MDN 复习一下em 组件的调用: 是msg让“ViteVue”显示出来的&#xff01;&#xff01; a标签的targte属性&#xff1a; 组件之间怎么传值的&#xff1a; &#xff0c;没看懂code标签怎么…

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案

一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO&#xff08;先进先出&#xff09;变更为 LIFO&#xff08…

PD快充诱骗协议芯片XSP04D与主板共用一个Type-C和电脑传输数据

随着智能电子产品的广泛应用&#xff0c;快充方案越来越受到重视&#xff0c;且迭代次数也更加频繁。在一些使用频率较高、耗电较大的电子产品中&#xff0c;快充方案也成为了大多数人的追求&#xff0c;它能很大程度上缩短充电的时间&#xff0c;例如XSP04D这款快充诱骗协议方…

goland无法debug

goland无法使用debug&#xff0c;修复_goland无法debug-CSDN博客

ECLIC中断流程及实际应用 —— RISC-V中断机制(二)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解

这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…

debian中笔记本的省电选择auto-cpufreq

在reddit中&#xff0c;看评论区出现这个软件&#xff0c;于是打算尝试一下&#xff0c;应该能对不使用电源时笔记本的省电起到一定的作用。 https://github.com/AdnanHodzic/auto-cpufreq?tabreadme-ov-file#why-do-i-need-auto-cpufreq 作用 One of the problems with Linux…

力扣热题100之环形链表 II

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…

【记录】HunyuanVideo 文生视频工作流

HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作&#xff0c;包含环境配置、模型安装和工作流使用说明。 参考&#xff1a;https://comfyui-wiki.com/zh/install/install-comfyui/install-c…

SpringCloud之Ribbon基础认识-服务负载均衡

0、Ribbon基本认识 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。 Ribbon 会基于某种规则&#xff08;如简单…

重生之我在2024学Fine-tuning

一、Fine-tuning&#xff08;微调&#xff09;概述 Fine-tuning&#xff08;微调&#xff09;是机器学习和深度学习中的一个重要概念&#xff0c;特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后&#xff0c;再针对特定的任务或数据…

Selenium Web自动化测试学习笔记(一)

自动化测试 技术手段模拟人工&#xff0c;执行重复性任务&#xff0c;准确率100%&#xff0c;高于人工 selenium 可通过浏览器驱动控制浏览器&#xff0c;通过元素定位模拟人工&#xff0c;实现web自动化&#xff0c;没有焦点&#xff08;把浏览器放在最小化依然可以&#x…

2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证

2025年5月5日前 免费考试了&#xff01; Oracle AI 矢量搜索专业​​认证 立刻预约吧 文章目录 2025年5月5日前 免费考试了&#xff01; Oracle AI 矢量搜索专业​​认证立刻预约吧&#x1f50d; 探索 AI 向量搜索的强大功能&#xff01;&#x1f3af; 学习路径目标&#x1f6e…

EasyRTC嵌入式音视频通话SDK驱动智能硬件音视频应用新发展

一、引言 在数字化浪潮下&#xff0c;智能硬件蓬勃发展&#xff0c;从智能家居到工业物联网&#xff0c;深刻改变人们的生活与工作。音视频通讯作为智能硬件交互与协同的核心&#xff0c;重要性不言而喻。但嵌入式设备硬件资源受限&#xff0c;传统音视频方案集成困难。EasyRT…

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio 前置条件 已经成功安装 kubesphere v4.3.1 参考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安装基础依赖 # ubuntu安装基础依赖 apt insta…

1.短信登录

1.0 问题记录 1.0.1 redis 重复 token 问题 每次用户登录时&#xff0c;后端会创建一个新的 token 并存入 Redis&#xff0c;但之前登录的 token 还没有过期。这可能会导致以下问题&#xff1a; 1. Redis 中存在大量未过期但实际已不使用的 token2. 同一用户可能有多个有效 …

Linux-Ubuntu安装Stable Diffusion Forge

SD Forge在Win上配置起来相对简单且教程丰富&#xff0c;而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版&#xff08;对其他Linux以及SD分支亦有参考价值&#xff09;的Stable Diffusion ForgeUI安装配置教程&#xff0c;希望有所帮助 本教程以N…