Golang网络编程

2023-11-18

互联网协议介绍引入

1. 物理层(Physical Layer):
   - 功能:物理层负责定义物理介质传输数据的方式和规范,它传输的是原始数据比特流。
   - 协议:Ethernet、Wi-Fi、USB、光纤等。
   - 例子:将数据通过网线传输的过程类似于我们通过电话线进行声音通信。

2. 数据链路层(Data Link Layer):
   - 功能:数据链路层负责将数据分成帧,并进行传输错误的检测和纠正。
   - 协议:Ethernet(MAC地址)、PPP(点对点协议)等。
   - 例子:当我们接收到一封电子邮件时,电子邮件被分成小块,每个块都有一个标识符,以确保它们的正确接收。

3. 网络层(Network Layer):
   - 功能:网络层负责在网络中选择最佳的路径进行数据传输和路由。
   - 协议:IP(Internet协议)、ICMP(Internet控制消息协议)等。
   - 例子:当我们使用导航应用程序时,它会根据我们的位置、交通情况和其他因素决定最佳路线。

4. 传输层(Transport Layer):
   - 功能:传输层负责提供可靠的端到端数据传输和错误恢复。
   - 协议:TCP(传输控制协议)、UDP(用户数据报协议)等。
   - 例子:当我们下载文件时,传输层确保文件被正确地分割成数据包,并且在接收端按正确顺序重新组装。

5. 会话层(Session Layer):
   - 功能:会话层负责建立、管理和终止网络中的会话。
   - 协议:TLS(安全传输层协议)、SSH(安全外壳协议)等。
   - 例子:当我们在网上购物时,会话层确保我们与商家之间的通信是加密和安全的。

6. 表示层(Presentation Layer):
   - 功能:表示层负责数据的格式化、加密和压缩,确保不同系统间的数据能正确解释和理解。
   - 协议:JPEG(图像压缩标准)、MPEG(音视频压缩标准)等。
   - 例子:当我们分享相片时,表示层负责将图像转换成适合传输和显示的格式。

7. 应用层(Application Layer):
   - 功能:应用层负责发送和接收应用程序之间的数据,并提供应用程序所需的服务。
   - 协议:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等。
   - 例子:当我们使用浏览器访问网页时,应用层使用HTTP协议来请求和接收网页内容。

如下图所示,发送方的HTTP数据经过互联网的传输过程中会依次添加各层协议的标头信息,接收方收到数据包之后再依次根据协议解包得到数据。

socket图解

 什么是套接字

Socket(套接字)是一种用于实现网络通信的编程接口;

允许不同的计算机通过网络互相传递数据;

Socket提供了一种标准的编程接口,使得开发者可以使用通用的网络协议(如TCP/IP)进行网络通信。

下面举生活中的例子:

Socket是应用层与传输层之间的接口,它基于计算机网络原理,将网络传输分为两个角色:服务器(Server)和客户端(Client)

CS架构

- 服务器端(Server):服务器端监听特定的网络端口,等待客户端的连接请求。一旦接收到连接请求,服务器端创建一个新的Socket与客户端进行通信。

- 客户端(Client):客户端发起连接请求,并通过Socket与服务器端建立通信。客户端可以发送请求数据到服务器,并接收服务器的响应数据。

Socket操作涉及以下几个主要步骤:

1. 创建Socket:服务器端和客户端都需要创建一个Socket对象,用来进行通信(该对象包含了IP地址和端口号等信息)

2. 绑定Socket:服务器端需要将Socket绑定到一个具体的IP地址和端口号上,以便客户端能够连接。

3. 监听连接:服务器端通过Socket监听特定的端口,等待客户端的连接请求。

4. 接受连接:一旦服务器端接收到连接请求,它会创建一个新的Socket对象与客户端进行通信。

5. 数据传输:通过Socket对象,服务器端和客户端可以相互发送数据。

6. 关闭连接:通信完成后,服务器和客户端都可以关闭Socket连接。

生活中的例子可以是使用手机应用程序与服务器进行通信。举个例子,考虑一个聊天应用程序,其包括一个服务器和多个客户端。服务器负责接收和分发消息,而客户端负责发送和接收用户的消息。

在这个场景中,服务器端的应用程序创建了一个Socket并在指定端口上侦听。多个客户端应用程序也创建了各自的Socket对象,并使用服务器的IP地址和端口号连接到服务器。

一旦连接建立,客户端通过其Socket向服务器发送消息。服务器接收到消息后,可以将其转发给其他客户端。这样,通过Socket的使用,服务器和客户端可以实现实时的聊天功能。

总结来说,Socket是一种网络编程接口,用于在服务器端和客户端之间建立通信。通过Socket,计算机可以通过网络传输数据,实现各种应用程序的网络通信。

常用的Socket类型有两种:流式Socket和数据报式Socket,流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,针对于无连接的UDP服务应用

TCP:比较靠谱,面向连接,比较慢

UDP:不是太靠谱,比较快

前提概念几则

net包

Go语言实现TCP通信

TCP协议

TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网际协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

TCP服务端

一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创建一个goroutine去处理。

TCP服务端程序的处理流程:

    1.监听端口
    2.接收客户端请求建立链接
    3.创建goroutine处理链接。   

TCP服务端代码如下:

package main

import (
	"bufio"
	"fmt"
	"net"
)



// 服务端
func process(conn net.Conn) {
    defer conn.Close() // 关闭连接
    for {
        reader := bufio.NewReader(conn)
        var huancun [128]byte
        n, err := reader.Read(huancun[:]) // 读取数据
        if err != nil {
            fmt.Println("从客户端读取数据失败,报错为:", err)
            break
        }
        data := string(huancun[:n])
        fmt.Println("收到client端发来的数据:", data)
        conn.Write([]byte(data)) // 发送数据
    }
}

func main() {
    listen, err := net.Listen("tcp", "127.0.0.1:30000")
    if err != nil {
        fmt.Println("listen failed, err:", err)
        return
    }
    for {
        conn, err := listen.Accept() // 建立连接
        if err != nil {
            fmt.Println("accept failed, err:", err)
            continue
        }
        go process(conn) // 启动一个goroutine处理连接
    }
}   
这是一个简单的TCP服务器程序,它监听在本地的30000端口上,并接受客户端的连接。
一旦有连接建立,就会启动一个goroutine来处理连接。

在处理连接的goroutine中,首先创建一个bufio.Reader对象来读取客户端发送的数据。
然后创建一个长度为128的字节数组作为缓冲区,
使用reader.Read()方法从客户端读取数据,并将读取到的数据存储在缓冲区中。

如果读取过程中发生错误,就打印错误信息并退出循环。
否则,将读取到的数据转换为字符串,并打印出来。然后将读取到的数据通过conn.Write()方法发送回客户端。

在main函数中,首先使用net.Listen()方法创建一个监听器,监听在本地的30000端口上。
如果监听失败,就打印错误信息并返回。否则,进入一个无限循环,不断接受客户端的连接。

在每次接受连接时,如果出现错误,则打印错误信息并继续下一次循环。
否则,启动一个goroutine来处理该连接,即调用process()函数。这样可以同时处理多个客户端的连接。

编译为可执行文件

go build -o server.exe
TCP客户端模拟
package main

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



// 客户端
func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:30000")
    if err != nil {
        fmt.Println("err :", err)
        return
    }
    defer conn.Close() // 关闭连接
    inputReader := bufio.NewReader(os.Stdin)
    for {
        input, _ := inputReader.ReadString('\n') // 读取用户输入
        inputInfo := strings.Trim(input, "\r\n")
        if strings.ToUpper(inputInfo) == "Q" { // 如果输入q就退出
            return
        }
        _, err = conn.Write([]byte(inputInfo)) // 发送数据
        if err != nil {
            return
        }
        buf := [512]byte{}
        n, err := conn.Read(buf[:])
        if err != nil {
            fmt.Println("recv failed, err:", err)
            return
        }
        fmt.Println(string(buf[:n]))
    }
}   
这是一个基于TCP的简单客户端代码。它通过网络连接到指定的地址和端口
并且可以发送用户输入的数据并接收服务器返回的数据。

在主函数中,首先通过`net.Dial()`函数建立与服务器的连接,并检查是否有错误发生。

如果有错误,将打印错误信息并返回。

然后,通过`bufio.NewReader()`创建一个读取用户输入的读取器。

然后使用一个无限循环来不断读取用户输入。

在每次循环中,使用`inputReader.ReadString('\n')`读取用户输入。然后使用`strings.Trim(input, "\r\n")`去掉换行符、回车符。

下一步是检查用户输入是否为大写的"Q",如果是的话,退出循环,在此之前关闭连接。
如果不是"Q",则使用`conn.Write()`将用户输入的数据发送到服务器。

然后,使用`conn.Read()`从服务器接收数据,存储在缓冲区`buf`中。读取到的字节数存储在变量`n`中,如果有错误发生,则打印错误信息并返回。

最后,使用`fmt.Println(string(buf[:n]))`打印从服务器接收到的数据。循环会继续,等待用户的下一次输入。

编译为可执行文件

go build -o client.exe

测试一下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang网络编程 的相关文章

随机推荐

  • Vue3 + Element-UI 搭建一个后台管理系统框架模板

    概述 本文将介绍如何基于Vue3和element ui搭建一个后台管理系统框架模板 我们将详细讲解代码流程 并提供详细的说明 技术栈 Vue3 Element ui Axios 前置知识 本文假设读者已经熟悉Vue3和Element ui的
  • Bootstrap插件(六)——警告框(alert.js)

    bootstrap中的alert和原本的alert弹框可不太一样 原来我们熟悉的弹框是在执行某个动作的时候 浏览器和我们弹出来的一个提示框 比如下面这样 而我们这里的警告框是在html内容之间的提示内容 只是他有着醒目的颜色 以此来达到提醒
  • h5标签上实现文字空格

    在vue项目中实现文字之间的空格 div class top p class groupLeader 组 xa0 xa0 xa0 长 span xxx span p p class standingGroupLeader 副组长 span
  • [YOLO专题-23]:YOLO V5 - ultralytics代码解析-网络子结构详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122369993 目录 第1章 网络总
  • [QT编程系列-2]:C++图形用户界面编程,QT框架快速入门培训 - 1- 预备知识

    目录 概述 1 前置条件 1 1 C 1 2 图形界面 1 3 图形程序集成开发环境 1 4 图形程序开发框架 1 5 跨平台特性 1 6 QT快速感知 1 6 1 QT的典型应用 1 6 2 QT的特点 1 6 3 QT跨平台集成开发环境
  • Qt QProcess

    目录 概述 实 现 一 函数接口 二 执行命令 三 管 道 概述 本文介绍 在Linux环境下 使用Qt中的QProcess类执行shell命令并获取输出 头文件 include
  • 区块链数字签名详解

    有一点比较难以理解的答案就是 私钥加密公钥可以解密 公钥加密私钥可以解密 RSA的原理 两个大质数 p q 乘积 n 难以逆向求解 所以pq是对等的 公钥和私钥也是对等的 区块链 从数字货币到信用社会 读书笔记 这张图来自于新生大学的周兵
  • 【Vue项目实战】Vue3动画神操作!教你如何实现PPT一样的动画效果!

    文章目录 前言 一 Animate css是什么 二 安装和使用 1 安装 2 基本用法 3 JavaScript用法 三 动画制作 1 弹入动画 总结 前言 最近写界面的时候 发现一个前端组件很好玩 他就是鼎鼎大名的 Animate cs
  • 海康工业摄像头调用(linux基于python和opencv)

    1 下载官网客户端 其中包含SDK 官方网站 海康机器人 机器视觉 下载中心 安装deb文件 sudo dpkg i deb文件名 2 运行客户端 cd opt MVS bin MVS sh 如果连不上 看看是不是usb3 0的接口 3 调
  • ThinkPHP 日志信息泄露漏洞复现

    ThinkPHP 日志信息泄露漏洞复现 漏洞简介 ThinkPHP在开启DEBUG的情况下会在Runtime目录下生成日志 而且debug很多网站都没有关 ThinkPHP默认安装后 也会在Runtime目录下生成日志 THINKPHP3
  • 基于SSM 和 layui 的增删查改

    开发工具 IDEA 2021 WebStorm 2021 Mysql 8 0 开发环境 JDK 8 TomCat 8 5 81 apache maven 3 6 1 技术点 Spring SpringMVC Mybatis Mysql Ht
  • express使用简介

    框架搭建 1 安装脚手架 npm install g express generator 2 创建项目 express myapp 查看项目目录 可以知道启动文件www作用是提供http服务 express是一个全栈环境 所以有views
  • 维普期刊 瑞数5

    郑重声明 本项目的所有代码和相关文章 仅用于经验技术交流分享 禁止将相关技术应用到不正当途径 因为滥用技术产生的风险与本人无关 加载流程 url aHR0cDovL2xpYi5jcXZpcC5jb20vUWlrYW4vU2VhcmNoL0l
  • TCP/IP详解 卷1:协议 学习笔记 第十六章 BOOTP:引导程序协议

    一个无盘系统在不知道自身IP地址情况下 进行系统引导时能通过RARP协议获取它的IP地址 使用RARP会有两个问题 1 IP地址是返回的唯一结果 2 RARP使用链路层广播 RARP请求不会被路由器转发 每个实际网络必须设置一个RARP服务
  • leetcode算法面试题:打家劫舍问题

    题目 你是一个专业的小偷 计划偷窃沿街的房屋 每间房内都藏有一定的现金 影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统 如果两间相邻的房屋在同一晚上被小偷闯入 系统会自动报警 给定一个代表每个房屋存放金额的非负整数数组 计算你
  • 50个c/c++源代码网站

    C C 是最主要的编程语言 这里列出了50名优秀网站和网页清单 这些网站提供c c 源代码 这份清单提供了源代码的链接以及它们的小说明 我已尽力包括最佳的C C 源代码的网站 这不是一个完整的清单 您有建议可以联系我 我将欢迎您的建 议 以
  • Maven下载、安装和配置教程(2023年6月10日)

    Maven下载 安装和配置教程 2023年6月10日 一 下载安装包 二 安装 三 配置环境变量 系统是win10 四 验证是否安装成功 五 配置文件 六 idea里配置 一 下载安装包 链接 https pan baidu com s 1
  • 西部数据出现“WD SES Device USB Device”怎么办,而且说明书全是英文。

    您好 wd ses device driver这个驱动程序可以在baidu中输入关键词找到 什么驱动之家 驱动人生之类的专业驱动网站也都是有的 western digital的移动硬盘驱动程序安装步骤请见下图 转载于 https www c
  • glob.glob in python

    reference glob glob in python 功能 返回一个某一种文件夹下面的某一类型文件路径列表
  • Golang网络编程

    互联网协议介绍引入 1 物理层 Physical Layer 功能 物理层负责定义物理介质传输数据的方式和规范 它传输的是原始数据比特流 协议 Ethernet Wi Fi USB 光纤等 例子 将数据通过网线传输的过程类似于我们通过电话线