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

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

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

相关文章

SpringBoot 3.2.0 版本 mysql 依赖下载错误

最近想尝试一下最新的 SpringBoot 项目,于是将自己的开源项目进行了一些升级。 JDK 版本从 JDK8 升级至 JDK17。SpringBoot 版本从 SpringBoot 2.7.3 升级到 SpringBoot 3.2.0 其中 JDK 的升级比较顺利,毕竟 JDK 的旧版本兼容性一直非常好。 但是在升级…

【XR806开发板试用】+ 通过网络控制led并上报按键状态

通过网络控制led并上报按键状态 本次做一个手机通过mqtt服务器控制板子上的LED亮灭,板子也可以将按钮状态变化通过mqtt服务器上报给手机的功能 硬件上,从原理图看,LED接到了PA21,高电平点亮。 按键则时接到了PA11,并…

GitHub帐户管理更改电子邮件

登录到您的 GitHub 帐户: 前往 GitHub 网站并使用您的凭据登录。 访问个人设置: 单击右上角的您的头像,然后选择“Settings”(设置)。 选择电子邮件选项卡: 在左侧边栏中选择“Emails”(电子邮…

gradle-5.4.1-all下载时出现了Connect timed out

问题描述:最近在学习如何在手机端部署YOLO,出现了许多错误,其中之一的错误:gradle-5.4.1-all下载时出现了Connect timed out,大家都知道这是从国外网站下载网络问题导致的。 解决办法: 在我们创建项目中的一个路径下…

【深度学习】强化学习(三)强化学习的目标函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略(Policy)4、马尔可夫决策过程5、强化学习的目标函数1. 总回报(Return)2. 折扣回报(Discounted Return)a. 折扣率b. 折扣回报的定义 3.…

钉钉机器人发送表格

背景: 由于每次发送excel连接,不太好看,想着简单的表格直接用消息的方式发送在群里,就想着弄一个直接发送的表格信息,但是钉钉官网是没有的。 我估计钉钉的开发人员也没有想过,会有人钻空子,用markdown发送…

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

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

MySQL——数据类型

目录 一.数据类型分类 二. 数值类型 1.tinyint类型 2.bit类型 3.float类型 4.decimal 三.字符串类型 1.char 2.varchar 四.日期和时间类型 五.enum和set 一.数据类型分类 关于数据库的数据类型有非常多,但是并非所有的数据类型都是我们常用的&#xff…

Java 实现汉字转拼音带音调

代码 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourcefo…

【亲测】获取百度智能云access_token并存储,百度智能云access_token有效期

百度智能云服务内置很多api接口(文字识别,企业信息识别,等),所有百度智能云自带的接口都会用到百度的access_token 第一步:登录百度智能云管理中心 第二步:创建账户,完整身份认证 …

鸿蒙OS应用开发之登录界面

在前面学习了输入文本组件和按钮组件,可以使用这两种组件来实现一些常用的功能,比如登录界面,这种界面是每个程序员经常会到遇到的,比如让用户输入用户名称和密码。 在这里我们就来实现如下面的界面: 在上面界面里,第一个文本框用来输入用户名称,第二个用来输入用户密码…

老杨说运维 | 年末大盘点!擎创CEO实时盘点运维大干货,不容错过

2023年即将走到尾声,对于擎创而言,这一年是颇具成长和成就的一年。我们庆幸获得了更多客户的信任,也为他们达到下一个运维阶段提供了充足的助力。 越多的实践就会带来越多新的理解和可优化的经验。这一年来,擎创在运维数据治理、智…

docker搭建maven私库Nexus3

什么是Maven私服? Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 当然也并不是说私服只能建立在局域网,也有很多公司会…

使用静态HTTP提供动态内容

在Web开发中,静态HTTP和动态HTTP常被视作两种截然不同的技术。静态HTTP主要用于传输不变的内容,如HTML、CSS和JavaScript文件,而动态HTTP则能处理用户交互、实时数据等动态需求。但鲜为人知的是,我们其实可以通过一些技巧&#xf…

vue中 把vue页面导出为 html页面

vue导出文件后缀为html的页面 震惊&#xff01;我司要求我把数据融合起来&#xff0c;导出用html的方式展示&#xff0c;请看下面示例 <template><div><el-button click"gethtml">导出报告</el-button><div id"main"><…

高通8255芯片烧写方法

目录 一&#xff1a;高通官方提供软件下载 QPM&#xff08;Qualcomm Package Manager&#xff09; 二&#xff1a;烧写驱动程序下载 USB Drivers 三&#xff1a;烧写工具下载QCAT 四&#xff1a;QCAT软件使用 4.1串口选择 4.2 烧写选项配置 4.3 开始烧写下载 4.4烧写成…

若依打包将vue放到.jar里面部署

1.vue静态文件&#xff0c;以及单页面 ruoyi-admin\src\main\resources\static \ruoyi-admin\src\main\resources\templates 2.后台开放白名单 "/cms", "/cms#/login" 3. mvc访问vue页面入口&#xff0c;接口 package com.ruoyi.web.controller.syst…

基于springboot实现的健身房管理系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jdbc 环境&#xff1a;jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理员-首页 03. 管理员-会员卡查询 04. 管理员-会员管理…

新零售ERP软件功能有哪些?新零售ERP系统哪个操作简单

新零售企业通常存在多仓库、多营销渠道、多业务模式、价格策略灵活、供应链复杂等情况&#xff0c;如何实现配送、财务、客户、订单、仓储等业务数据一体化和智能化管理&#xff0c;是不少新零售企业需要解决的难点。 随着新零售企业数量不断增多&#xff0c;行业之间的竞争也…

酷开科技丨出“奇”不意,酷开系统给客厅多点颜色!

对现代人来说&#xff0c;关于“家”的含义&#xff0c;有了更多的认识。家&#xff0c;不仅要遮风挡雨&#xff0c;温暖适意&#xff0c;更要能让人摆脱高负荷生活&#xff0c;成为一个可以汲取能量、重获元气的安心乐园。品质不单单是简单的一个词&#xff0c;更是一个美好家…