Golang网络编程

news2024/12/24 8:43:48

互联网协议介绍引入

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

测试一下:

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

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

相关文章

[javaWeb]Socket网络编程

网络编程:写一个应用程序,让这个程序可以使用网络通信。这里就需要调用传输层提供的 api。 Socket套接字 传输层提供协议,主要是两个: UDP和TCP 提供了两套不同的 api,这api也叫做socket api。 UDP和 TCP 特点对比: UDP: 无连…

数据结构day05(单链表)

今日任务&#xff1a; 思维导图&#xff1a; 实现 代码&#xff1a;&#xff08;多文件&#xff09; head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int datatype;typedef struct Lin…

Nuxt3 与 Vue3 的 Server api 全栈开发之路

Nuxt Server Api 阅读时长&#xff1a;15分钟 本文内容&#xff1a; 国内关于Nuxt3的资料太少了&#xff0c;而Nuxt3又发布了没有多久&#xff0c;导致资料太少。本文浓缩讲解了&#xff0c;对于一个前端开发&#xff0c;上手使用 Nuxt3&#xff0c;并一个人承担前后端开发的所…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

网络安全—0基础学习笔记(黑客)

一、前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

2023年智慧政务一网通办云平台顶层设计与建设方案PPT

导读&#xff1a;原文《2023年智慧政务一网通办云平台顶层设计与建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 喜欢文章&#…

Spring——RESTful Web服务

文章目录 RESTful Web 服务介绍内容概览下载 Lombok 优化代码利器RESTful Web 服务开发运行项目并测试效果 RESTful Web 服务介绍 本节我们将开发一个简单的 RESTful Web 服务。 RESTful Web 服务与传统的 MVC 开发一个关键区别是返回给客户端的内容的创建方式&#xff1a;传…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多&#xff0c;比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker&#xff1a;表示消息队列服务实体Virtual Host&#x…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(一)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;一&#xff09; 一&#xff1a;TensorFlow基础知识内容部分&#xff08;简明扼要&#xff0c;快速适应&#xff09;1、下载Cifar10数据集&#xff0c;并进行…

react17:生命周期函数

挂载时更新时 setState触发更新、父组件重新渲染时触发更新forceUpdate触发更新卸载时 react&#xff08;v17.0.2&#xff09;的生命周期图谱如下。 相较于16版本&#xff0c;17版本生命周期函数有如下变化&#xff1a; componentWillMount() componentWillUpdate() compone…

mac电脑屏幕录制Berrycast Mac屏幕录制软件

Berrycast是一款为Mac设计的优秀屏幕录制软件&#xff0c;它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点&#xff1a; 简单的用户界面&#xff1a;Berrycast拥有直观和简洁的用户界面&#xff0c;使得用户可以轻松上手。高质量的视频输出&#xff1a;Berrycast能…

电商系统架构设计系列(十):怎么能避免写出慢SQL?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;怎么能避免写出慢SQL&#xff1f; 我们知道&#xff0c;一个慢 SQL 就可以直接让 MySQL 瘫痪。以我个人经验总结来看&#xff0c;一般情况下系统出问题&#xff0c;大多数都是因为SQL语句的问题。掌握和用好了SQL&…

软件面试题:文件上传下载测试点

目前关于云文档的业务还是挺多的&#xff0c;相信出去面试的同学&#xff0c;大多会遇到这道高频软件测试面试题&#xff1a;文件上传下载测试点。今天向大家分享下&#xff0c;希望对大家有所启发。 一、文件上传测试点 1、文件大小 一般情况下&#xff0c;系统会设定上传文…

基于OV2640/ OV5640 的图像采集显示系统

基于OV2640/ OV5640 的图像采集显示系统系列文章目录&#xff1a; &#xff08;1&#xff09;基于 OV5640 摄像头理论知识讲解-成像和采样原理 &#xff08;2&#xff09;基于 OV5640 摄像头理论知识讲解-数字接口和控制接口 &#xff08;3&#xff09;基于 OV5640 摄像头理论知…

Mac软件删除方法?如何删除不会有残留

Mac电脑如果有太多无用的应用程序&#xff0c;很有可能会拖垮Mac系统的运行速度。因此&#xff0c;卸载电脑中无用的软件是优化Mac系统运行速度的最佳方式之一。Mac卸载应用程序的方式是和Windows有很大的区别&#xff0c;特别对于Mac新用户来说&#xff0c;如何无残留的卸载删…

Python Qt(七)Listview

源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_listview.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not…

2024王道408数据结构P144 T18

2024王道408数据结构P144 T18 思考过程 首先还是先看题目的意思&#xff0c;让我们在中序线索二叉树里查找指定结点在后序的前驱结点&#xff0c;这题有一点难至少对我来说…我讲的不清楚理解一下我做的也有点糊涂。在创建结构体时多两个变量ltag和rtag&#xff0c;当ltag0时…