go学习之网络编程

文章目录

    • 网络编程
      • 1、网络编程的基本介绍
      • 2.网络编程的基础知识
        • 1)协议(tcp/ip)
        • 2)OSI与TCP/ip参考模型
        • 3)ip地址
        • 4)端口(port)介绍
        • 5)tcp socket编程的客户端和服务器端
      • 3.socket编程快速入门
      • 4.经典项目-海量用户即时通讯系统
        • 1)项目开发流程
        • 2)需求分析
        • 3)界面设计

网络编程

1、网络编程的基本介绍

Golang的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端程序必不可少也是至关重要的一部分

网络编程有两种

1)TCP socket编程,是网络编程的主流。之所以交TCP socket编程,是因为底层是基于Tcp/ip协议的,比如QQ聊天

2)b/s结构的http编程。我们使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是tcp socke实现的,比如京东商城(这属于go web开发范畴)

2.网络编程的基础知识

1)协议(tcp/ip)

TCP/IP(Transmission Control Protocal)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通信协议,这个协议是Internet最基本的协议 internet国际互联网的基础,简单的说,就是由网络层的IP协议和传输层的TCP协议组成的

协议的抽象理解图

在这里插入图片描述

2)OSI与TCP/ip参考模型

在这里插入图片描述

详细结构(模拟qq好友发送数据经过的网络协议层)

在这里插入图片描述

3)ip地址

概述:每个internet上的主机和路由器都有一个ip地址,他包括网络和主机号,ip地址有ipv4(32位)和ipv6(128位),可以通过ipconfig来查看

4)端口(port)介绍

我们这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议上的端口,是逻辑意义上的端口

如果把ip地址比作一个房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个ip地址的端口可以有65536(256256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是0到65535(256256-1)

端口–分类

  • 0是保留端口
  • 1-1024是固定端口 又叫有名端口,即被某些程序固定使用,一般程序员不使用, 22:SSH远程登录协议 23:telnet使用 21:Ftp使用 25:smtp服务使用 80:iis使用 7:echo服务
  • 1025-65535是动态端口这些端口,程序员是可以使用的(尽量使用40000以上的端口,这样不易冲突,更好地进行监听操作)

在这里插入图片描述

端口(port)-使用注意

  • 在计算机(尤其是做服务器)要尽可能的少开端口
  • 一个端口只能被一个程序监听
  • 如果使用netstat -an 可以查看本机有哪些端口在监听
  • 可以使用netstat -anb来查看监听端口的pid,在结合任务管理器关闭不安全的端口
5)tcp socket编程的客户端和服务器端

下图为Golang socket编程中客户端和服务器的网络分布

在这里插入图片描述

3.socket编程快速入门

项目示意图

在这里插入图片描述

1)服务端的处理流程

-1.监听端口

-2.创建客户端的tcp连接,建立客户端和服务端的连接

-3.创建goroutine,处理该连接的请求(通常客户端会通过连接来发送请求包)

server.go

package main
import (
	"fmt"
	"net" //做网络socket开发时。net包含有我们需要所有的方法和函数
	// "io"
)

func process(conn net.Conn) {
	//这里我们循环的接收客户端发送的数据
	defer conn.Close() //关闭conn

	for {
		//创建一个新的切片
		buf := make([]byte,1024)
		//1.等待客户端通过conn发送信息
		//2.如果客户端没有write[发送],那么协程就阻塞在这里
		fmt.Printf("服务器在等待客户端%s 发送信息"+ conn.RemoteAddr().String())
		n,err :=conn.Read(buf) //从conn读取
		if err != nil {
			fmt.Printf("客户端退出 err=%v\n",err)
			return // !!!
		}
		//3.显示客户端发送的内容到服务器的终端
		fmt.Println(string(buf[:n]))
		
	}
}
func main() {
	fmt.Println("服务器开始监听")
	//net.Listen("tcp","0.0.0.0:8888")
	//1.tcp表示使用网络协议是tcp
	//2.0.0.0.0:8888 表示在本地监听8888端口
	listen, err :=net.Listen("tcp","0.0.0.0:8888")
	if err != nil {
		fmt.Println("listen err")
		return
	}
	defer listen.Close()  //延时关闭listen

	//循环等待客户端连接我
	for {
		//等待客户端连接诶
	    fmt.Println("等待客户端连接...")
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("Accept() err=",err)
		}else {
			fmt.Println("Accept() suc conn=%v 客户端ip为=%v\n",conn,conn.RemoteAddr().String())
		}
		//这里准备启动一个协程为客户端服务

		go process(conn)
	}
	// fmt.Printf("Listen successfully=%v\n",listen)
}

2)客户端的处理流程

-1.建立与服务端的链接

-2.发送请求数据,接收服务器端返回的结果数据

-3.关闭连接

3)客户端功能

-1.编写一个客户端程序,能连接到服务端的8888端口

-2.客户端可以发送单行数据,然后就退出

-3.能通过终端输入数据(输入一行发送一行),并发送给服务器端

-4.在终端输入exit表示退出程序

client.go

package main
import (
	"fmt"
	"net"
	"bufio"
	"os"
	"strings"
)

func main() {
	conn, err :=net.Dial("tcp","192.168.31.102:8888")
	if err != nil {
		fmt.Println("client dial err=",err)
		return
	}
	//功能1.客户端可以发送单行数据,然后就退出
	reader:= bufio.NewReader(os.Stdin) //os.Stdin 代表标准输入【终端】
    for {
	//从终端读取一行用户输入,并准备发送给服务器
	line, err :=reader.ReadString('\n')
	if err != nil {
		fmt.Println("readerString err=",err)
	}
	//如果用户输入的是exit就退出
	line = strings.Trim(line, "\r\n") 
	if line == "exit"{
		fmt.Println("客户端退出..")
		break
	}

	//再将line发送给服务器
	_, err =conn.Write([]byte(line+ "\n"))
	if err != nil {
		fmt.Println("conn.Write err=",err)
	}
	//fmt.Printf("客户端发送了%d字节的数据,并退出",n)
   }


}

运行效果图

在这里插入图片描述

4.经典项目-海量用户即时通讯系统

1)项目开发流程

需求分析 -->设计阶段–>编码实现–>测试阶段—>实施

2)需求分析

-1 用户注册

-2 用户登录

-3 显示在线用户列表

-4 群聊(广播)

-5 点对点聊天(私聊)

-6 离线留言

3)界面设计

在这里插入图片描述

项目开发前技术准备

项目要保存用户信息和消息数据,因此我们需要学习数据库(Redis和mysql),这里我们选择redis,先学习如何在golang中使用redis

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio 项目鸿蒙(HarmonyOS)资源引用(自定统和系统)

DevEco Studio 项目鸿蒙(HarmonyOS)资源引用(自定统和系统) 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、资源访问 HarmonyOS应用资源分为两类,一类是应用资源&…

kafka学习笔记--Kafka副本

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

go基础学习

用变量,之前需,先定义,该变量 一个go语言接口的模型:https://gitee.com/goku_black/go-gin-struct-test/blob/master/main.go 1、a和a区别? a是先进行取值,后进行自增。a是先进行自增,后进行取…

引用阿里图标库,不知道对应的图标是什么,可在本地显示图标ui,再也不要担心刚来不知道公司图标对应的是什么了

项目中使用了阿里的图标库,但是无法看到对应显示什么,每次都要去阿里图标库里面找 在下载下来的文件中会发现有两个文件一个是iconfont.css和iconfont.json, 这两个文件的数据可以拿到然后显示在页面上 有两个问题: 1&#xff1a…

Leetcode—230.二叉搜索树中第K小的元素【中等】

2023每日刷题(六十) Leetcode—230.二叉搜索树中第K小的元素 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nul…

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

机器人制作开源方案 | 智能助老机器人

作者:刘颖、王浩宇、党玉娟 单位:北京科技大学 指导老师:刘新洋、栗琳 1. 项目背景 1.1 行业背景 随着越来越多的服务机器人进入家庭,应用场景呈现多元化和专业化,机器人产业生态体系正在不断完善,服务…

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道)。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

C/C++ 有效的括号判断

题目: 给定一个只包括 (,),{,},[,]的字符串s,判断字符串是否有效。 约束: 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。…

正交调制与解调原理

一、正交调制与解调原理 /***************************************正交调制*********************************************/ 图中信道中的信号为:s(t)sR​(t)cos(w0​t)−sI​(t)sin(w0​t)(这就是正交调制后的信号) 我们可以通过傅里叶变…

UE4 UMG 颜色字体和PS对应关系

与PS中对应的是Hex sRGB色号 但是PS中采用的16进制色号为6位 UE4中的为8位 UMG制作时默认dpi为96像素/英寸,psd默认dpi是72像素/英寸。 在GUI设计时将dpi设为96,或者将72dpi下字体的字号乘以0.75,都能还原效果图中的效果。

CleanMyMac X这一款mac电脑清理垃圾文件软件好用吗?

CleanMyMac X您的 Mac。极速如新。点按一下,即可优化调整整个 Mac畅享智能扫描 — 这款超级简单的工具用于优化您的 Mac。只需点按一下,即可运行所有任务,让您的 Mac 保持干净、快速并得到最佳防护。CleanMyMac 是一款功能强大的 Mac 清理程序…

【数据结构和算法】移动零

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:双指针 2.2 方法二:两次遍历 2.3 方法三:一次遍历 三、…

三维成像激光雷达标定板可应用于各种领域

激光雷达技术是一种现代光学遥感技术,是传统雷达技术与现代激光技术相结合的产物,是以激光束作为信息载体,可以用振幅、相位、频率和偏振来搭载信息的雷达。 多线激光雷达则是通过多光束形成扫描平面,通过一维旋转机构实现四周的扫…

每日一博 - Cache Miss Attack

文章目录 概述解决思路缓存空值键并设置短期 TTL(生存时间)使用布隆过滤器 伪代码1. 缓存空值键并设置短期 TTLa. 缓存空值键b. 设置短期 TTL 2. 使用布隆过滤器a. 集成布隆过滤器b. 查询布隆过滤器 进一步优化系统性能的建议 概述 在缓存管理中&#x…

社交网络分析2(上):社交网络情感分析的方法、挑战与前沿技术

社交网络分析2(上):社交网络情感分析的方法、挑战与前沿技术 写在最前面1. 情感分析的基本概念社交网络情感分析的挑战与应用 情感分析研究现状2. 根据分析的对象,情感分析可以划分为哪几种类型,简要地进行说明。词汇表…

vue的slot插槽详解

目录 一、基本用法 在上面的例子中,我们在子组件中定义了一个插槽,然后在父组件中使用标签,并在标签内部放置了一个 标签作为插槽的内容。当父组件被渲染时,插槽的内容将被替换为实际传入的内容。 二、具名插槽 在上面的例子…

jmeter,csv文件参数化+断言 实现一个接口的case

1、case 及其 测试数据 注意保存文件的编码格式 id,name,limit,status,address,start_time,assert_status,assert_message 100,小米100,1000,1,某某会展中心101,2023-8-20 14:20,200,add event success ,,,,,,10021,parameter error 100,小米102,1002,1,某某会展中心103,2023-…

react经验8:使用antd的checkbox实现全选与半选控制

预期实现的效果 列表项部分选中时,checkall处于半选状态,点击checkall要么全选,要么全不选。 实现步骤 列表项类型 declare type TableRow {key: Keytitle: stringisSelected?: boolean }示范数据 const [tabledata, setTabledata] u…

透明PP专用UV胶水粘接PP材料高效率的提升生产效率

使用透明PP专用UV胶水粘接PP材料是提高生产效率的方法。以下方法,可以助您在生产中实现高效的PP材料粘接: ​1.选用合适的透明PP专用UV胶水 选择经过专门设计用于透明PP的UV胶水。这种胶水具有透明性,能保证粘接后的清晰度和外观。 2.自动…
最新文章