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

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() //关闭connfor {//创建一个新的切片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

相关文章:

go学习之网络编程

文章目录 网络编程1、网络编程的基本介绍2.网络编程的基础知识1)协议(tcp/ip)2)OSI与TCP/ip参考模型3)ip地址4)端口(port)介绍5)tcp socket编程的客户端和服务器端 3.socket编程快速入门4.经典项目-海量用户即时通讯系…...

将数组中的数逆序存放

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。 输入格式: 输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。 输出格式:…...

Unity Web 浏览器-3D WebView中有关于CanvasWebViewPrefab

一、CanvasWebViewPrefab默认设置 这个是在2_CanvasWebViewDemo示例场景文件中可以可以查看得到,可以看出CanvasWebViewPrefab的默认配置如下。 二、Web 浏览器网页和Unity内置UI的渲染顺序 1、如果你勾选了以下这个Native 2D Mode选项的话,那么Unit…...

一款计算机顶会爬取解析系统 paper info

一款计算机顶会爬取解析系统 paper info 背景项目实现的功能 技术方案架构设计项目使用的技术选型 使用方法本地项目部署使用ChatGPT等大模型创建一个ChatGPT助手使用阿里云 顶会数据量 百度网盘pfd文件json文件 Q&A github链接 :https://github.com/codebricki…...

CommonJs模块化实现原理ES Module模块化原理

CommonJs模块化实现原理 首先看一个案例 初始化项目 npm init npm i webpack -D目录结构如下: webpack.config.js const path require("path"); module.exports {mode: "development",entry: "./src/index.js",output: {path: p…...

实验4.1 静态路由的配置

实验4.1 静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.设置交换机和路由器的基本配置。2.使用display ip interface brief命令查看接口配置信息。3.配置静态路由,实现全网互通。 六、任务验收七、任务小结 一、任务描述 某公司刚…...

Java网络编程-深入理解BIO、NIO

深入理解BIO与NIO BIO BIO 为 Blocked-IO(阻塞 IO),在 JDK1.4 之前建立网络连接时,只能使用 BIO 使用 BIO 时,服务端会对客户端的每个请求都建立一个线程进行处理,客户端向服务端发送请求后,…...

ShenYu网关注册中心之HTTP注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 HttpClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解,注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disruptor1.2.…...

探索GameFi:区块链与游戏的未来融合

在过去的几年里,区块链技术逐渐渗透到各个领域,为不同行业带来了前所未有的变革。其中,游戏行业成为了一个引人注目的焦点,而这种结合被称为GameFi,即游戏金融。GameFi不仅仅是一个概念,更是一场区块链和游…...

Windows下使用CMake编译lua

Lua 是一个功能强大、高效、轻量级、可嵌入的脚本语言。它支持程序编程、面向对象程序设计、函数式编程、数据驱动编程和数据描述。 Lua的官方网站上只提供了源码,需要使用Make进行编译,具体的编译方法为 curl -R -O http://www.lua.org/ftp/lua-5.4.6.…...

【C语言(十一)】

C语言内存函数 一、memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果sourc…...

系统运行占用过高

1、CPU过高的问题排查 示例代码: public class Test { static class MyThread extends Thread { public void run() { // 死循环,消耗CPU int i 0; while (true) { i; } } } public static void main(String args[]) throws InterruptedException { ne…...

HTML---初识CSS

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS,开发者可以在不改变HTML标记结构的情况…...

监控pod 容器外网请求网络带宽,过滤掉内网、基于k8spacket开发、prometheus开发export

首先安装k8spacket 安装k8spacket遇到问题,下载插件一直能不能下载成功,pod不能启动。所有手动下载处理。 helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart helm pull k8spacket/k8spacket打开values.yaml 文件 手动下载插…...

windows下docker环境安装

开启硬件虚拟化技术 win10中开启 Hyper-V Win10 下是否开启硬件虚拟化技术,在控制面板,启用 window 功能,找到 Hyper-V 选项,点勾选确认。如图: Windows 11 家庭中文版新增 Hyper-V选项 注意以下的解决方案来自win1…...

Python小程序 - 表格数值统计

题设:Excel表格中,计算如下图所示不同颜色(蓝、黄、桔)单元格值:各颜色填涂的单元格值的总和条件: - Excle表格中 - 分色标记,单元格有值 - 开始列(当前为D),…...

Unity | Shader基础知识(第一集:unity中最简单的shader)

目录 一、unity的shader 二、创建一个shader(在创建时,选前三种都可以) 三、内容解读 1.shader一直都在 2.我们写shader在写什么 四、没有被干预的shader(最简单的shader) 相关阅读 编写着色器概述 - Unity 手册…...

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒,沙盒技术顾名思义就是像一个集装箱一样,把应用(服务,进程之类的)装起来的技术,这样每个进程在自己的沙盒中和其他的沙盒隔离开来,每个沙盒之间存在一个边界使得他们互不干扰&#xff0…...

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 : tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…...

【Docker】WSL 2 上的 Docker 搭建和入门

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 安装安装Docker Desktop for Windows 2️⃣ 环境配置3️⃣ hello world第一次运行再次运行分析总结 📖 参考资料 🛫 导读 开发环境 版本号描述文章日期2023-12-14操作系统Win11 - 22H222621.2715WSL2 C:…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...