Golang--网络编程

news/2024/11/8 23:01:37 标签: 网络, golang, 开发语言, 后端

1、概念

网络编程:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享数据、软件、数据信息等资源。

客户端(Client)

客户端是请求服务的计算机或程序,它可以是桌面应用、移动应用或网页应用。客户端通常负责用户界面的呈现和用户输入的处理。用户通过客户端向服务器发送请求,通常包括想要访问的数据或资源的具体信息。例如,当你在浏览器中输入一个网址时,浏览器就是客户端,它向相应的服务器发送请求来获取页面信息。

服务器端(Server)

服务器端是提供服务的计算机或程序,它接收来自客户端的请求并做出响应。服务器通常负责处理数据、运行业务逻辑、存储数据和管理网络资源。响应可以是所请求的数据、处理结果,或者是其他要求的资源。例如,当服务器接收到来自浏览器的请求时,它会查找相应的网页文件并将其发送回客户端。

设备之间在网络中进行数据的传输/接收数据。 

通信两个重要的要素:IP + PORT

设备之间进行传输的时候,必须遵照一定的规则 ----> 通信协议

TCP协议:可靠的
1、建立连接:三次握手


2、释放连接:

UDP协议:不可靠的 

 

2、TCP编程 -- 创建客户端

net包
Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国

Dial函数("net"):

package main
import (
	"fmt"
	"net" // 网络包
)

func main(){
	//打印:
	fmt.Println("客户端启动中...")
	//调用Dial函数:参数:协议、IP、端口号
	conn,err := net.Dial("tcp","127.0.0.1:8888") //协议、IP、端口号
	if err != nil{// 连接失败
		fmt.Println("客户端连接失败:err:",err)
		return
	}
	fmt.Println("连接成功,conn=",conn)
}

3、TCP编程 -- 创建服务器端

进行监听:

Listen函数("net"):

package main
import (
	"fmt"
	"net" // 网络包
)

func main(){
	//打印:
	fmt.Println("服务器端启动中...")
	//进行监听:需要指定服务器端TCP协议,服务器端的IP + PORT
	listen,err := net.Listen("tcp","127.0.0.1:8888") //协议、IP、端口号
	if err != nil{// 监听失败
		fmt.Println("监听失败:err:",err)
		return
	}
	//监听成功,等待客户端连接
	//循环等待客户端连接
	for {
		conn,err := listen.Accept() // 等待客户端连接
		if err!= nil{
			fmt.Println("客户端连接失败:err:",err)
			return
		}
		fmt.Printf("等待连接成功,conn=%v,接收到的客户端信息: %v \n",conn,conn.RemoteAddr().String())
	}
}

4、TCP编程 -- 连接测试

运行时注意:需要先启动服务器端,然后启动客户端进行访问:

5、TCP编程 -- 发送终端数据

通过客户端发送单行数据,然后退出:


客户端:

package main
import (
	"fmt"
	"net" // 网络包
	"bufio" // 缓冲包
	"os" // 操作系统包
)

func main(){
	//打印:
	fmt.Println("客户端启动中...")
	//调用Dial函数:参数:协议、IP、端口号
	conn,err := net.Dial("tcp","127.0.0.1:8888") //协议、IP、端口号
	if err != nil{// 连接失败
		fmt.Println("客户端连接失败:err:",err)
		return
	}
	fmt.Println("连接成功,conn=",conn)

	//通过客户端发送单行数据,然后退出:
	reader := bufio.NewReader(os.Stdin) // 读取用户输入的内容
	//从终端读取一行用户输入,并准备发送给服务器
	str, err := reader.ReadString('\n') // 读取用户输入的内容
	if err!= nil{
		fmt.Println("readString err:",err)
	}
	//发送数据:
	n,err := conn.Write([]byte(str)) // 发送数据
	if err!= nil{
		fmt.Println("conn.Write err:",err)
	}
	fmt.Printf("发送了%d字节的数据,并退出\n",n)
}

服务器端:

package main
import (
	"fmt"
	"net" // 网络包
)

func process(conn net.Conn){
	defer conn.Close() // 关闭连接
	for{
		//创建一个切片,用于存储读取到的客户端发送的数据
		buf := make([]byte,1024)
		
		//从conn连接中读取数据
		n,err := conn.Read(buf) // 读取数据
		if err!= nil{
			fmt.Println("conn.Read err:",err)
			return
		}
		//显示客户端发送的内容到服务器端的终端
		fmt.Print(string(buf[:n])) // 显示客户端发送的内容到服务器端的终端
		//向客户端回复ok
		conn.Write([]byte("ok...\n")) // 回复客户端
	}
}


func main(){
	//打印:
	fmt.Println("服务器端启动中...")
	//进行监听:需要指定服务器端TCP协议,服务器端的IP + PORT
	listen,err := net.Listen("tcp","127.0.0.1:8888") //协议、IP、端口号
	if err != nil{// 监听失败
		fmt.Println("监听失败:err:",err)
		return
	}
	//监听成功,等待客户端连接
	//循环等待客户端连接
	for {
		conn,err := listen.Accept() // 等待客户端连接
		if err!= nil{
			fmt.Println("客户端连接失败:err:",err)
			return
		}else{
			fmt.Printf("等待连接成功,conn=%v,接收到的客户端信息: %v \n",conn,conn.RemoteAddr().String())
		}

		//准备一个协程,协程处理客户端服务请求
		go process(conn) // 协程处理客户端服务请求,不同的客户端连接,需要不同的协程处理
	}
}


http://www.niftyadmin.cn/n/5744527.html

相关文章

面试题:Spring(一)

1. Spring框架中bean是单例么? Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例。 2. Spring框架中的…

使用Netty实现一个简单的聊天服务器

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:Netty 🥭本文内容&a…

MyBatis几种SQL写法

目录 1. 批量操作:通过标签支持批量插入 2. 批量操作:通过标签支持批量更新 3. 批量操作:通过标签支持批量删除 4. 动态SQL 3. 多条件分支查询 4. SQL语句优化:使用标签避免多余的AND或OR关键字。 5. 注解方式使用MyBatis 6. 一对多 7. 多对一&…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

结合Vue3+echarts实现部分地区地图下沉功能

项目需求:实现下沉七大洲->国家(中国)->省->市->区 实现思路:首先需要下载对应地图的json文件放在项目中进行引用,并且修改对应的配置。 V1-第一步简单实现地图 一、首先需要下载世界(包含国家)对应的j…

class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys

class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys ry-cloud报错原因解决 ry-cloud 报错 系统监控→在线用户打开后报错 报错信息如下 class com.alibaba.fastjson2.JSONObject cannot be cast to class com.ruoyi.sys原因 type导致&#xff…

气爪在自动化装配线中是如何应用的?

气爪在自动化装配线中的应用是现代工业自动化中的一个重要组成部分,它们以其高效、精确和可靠的性能,显著提升了生产效率和产品质量。 在自动化装配的世界里,气爪以其灵活性和精确性,成为生产线上不可或缺的工具。它的核心部件包括…

2024年汽车修理工(高级)证考试题库及汽车修理工(高级)试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年汽车修理工(高级)证考试题库及汽车修理工(高级)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(…