[go学习笔记.第十六章.TCP编程] 1.基本介绍以及入门案例

news2024/7/31 9:28:28

1.基本介绍

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

网络编程有两种户

(1).TCP Socket 编程,是网络编程的主流。之所以叫TCP Socket 编程,是因为底层是基于 TCP/IP 协议的,比如:QQ聊天

(2).B/S结构的 http编程,我们使用浏览器去访问服务器时,使用的就是 http协议,而 http底层依旧是用TCP Socket 实现的, 比如:京东商城 【 这属于 go web 开发范畴 】

2.网线,网卡,无线网卡 

计算机间相互通讯必须要求网线,网卡,或者无线网卡

(1).网线

网线是连接计算机与计算机、计算机与其它网络设备的连接线。常用的网线有双绞线、同轴细缆和光纤.

使用同轴细缆进行网络连接比较简单,只要将每台计算机或网络设备串联起来就可以了,但是维护起来比较麻烦,如果某处出了故障,整个网络就有可能瘫痪。从网络中添加或者去掉一台计算机,就必须停止网络的工作,等到添加或去掉计算机后,才能继续使用。同时,这种方式必须采用总线型拓扑结构,这种结构现在很少使用.

双绞线是由四对外覆绝缘材料的互相绞叠的铜质导线组成,并包裹在一个绝缘外皮内。它可以减少杂波造成的干扰,并抑制电缆内信号的衰减。如果使用双绞线,我们可以方便地在网络中添加或去掉一台计算机而不必中断网络的工作,网络的维护也比较简单,如果某处网线出现故障,只会影响到该条双绞线连接的计算机或设备,并不会造成网络的瘫痪。但是使用双绞线就必须在网络中添加集线器或交换机,增加了网络的成本

(2).网卡,无线网卡

        网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。由于其拥有MAC地址,因此属于OSI模型的第1层和2层之间。它使得用户可以通过电缆或无线相互连接。

每一个网卡都有一个被称为MAC地址的独一无二的48位串行号,它被写在卡上的一块ROM中。在网络上的每一个计算机都必须拥有一个独一无二的MAC地址。

没有任何两块被生产出来的网卡拥有同样的地址。这是因为电气电子工程师协会(IEEE)负责为网络接口控制器(网卡)销售商分配唯一的MAC地址

        无线网卡(英文名称:Wireless network interface controller,缩写为WNIC)是一种终端无线网络设备,它能够帮助计算机连接到无线网络上,例如WiFi或者蓝牙。换句话说无线网卡就是帮助你的电脑连接到无线网的一个装置,但是有了无线网卡也还需要一个可以连接的无线网络,因此就需要配合无线路由器或者无线 AP 使用

3.TCP/IP协议

        TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。 

TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网络接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等

4.OSI与TCP/IP参考模型

 

 5.IP地址

每个Internet上的主机和路由器都有一个ip地址,包括网络号和主机号,ip地址有ipv4(32位)或者ipv6(64位),可以通过ipconfig或者ifconfig查看

6.端口

(1).端口的介绍

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

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

 (2).端口的分类

0号是保留端口

1 ~ 1024 是固定端口,又叫有名端口,即被某些程序固定使用,一般程序员不使用

        7:echo 服务

        21: ftp 使用

        22:SSH远程登录协议

        23:telnet 使用

        25:smtp 服务使用

        80:iis使用

1025 一 65535 是动态端端口,这些端口,程序员可以使用

(3).端口的使用注意事项

1).在计算机(尤其是做服务器)要尽可能的少开端口

2).一个端口只能被一个程序监听

3).如果使用netstat -an可以查看本机有哪些端口在监听

4).可以使用netstat -anb来查看监听端口的pid,在结合任务管理器关闭不安全的端口

7.TCP Socket编程的客户端和服务器端

(1).服务端的处理流程

        1).监听端口8888

        2).接收客户端的tcp链接,建立客户端和服务器端的链接

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

(2).客户端的处理流程

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

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

        3).关闭链接

简单示意图

8.入门案例 

服务端功能:

        编写一个服务器端程序,在8888端口监听

        可以和多个客户端创建链接

        链接成功后,客户端可以发送数据,服务器端接受数据,并显示在终端上

        先使用telnet 来测试,然后编写客户端程序来测试

        服务端的代码如下:

package main

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

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

    fmt.Printf("listen success, success = %v\n", listen)

    defer listen.Close() // 延时关闭listen
    //循环等待客户端来连接
    for {
        //等待客户端连接
        fmt.Println("等待客户端连接...")
        conn, err := listen.Accept()
        if err != nil {
            fmt.Printf("listen accept err, err=%v\n", err)
        } else {
            fmt.Printf("listen success, success=%v, client addr = %v\n", conn, conn.RemoteAddr().String())
        }
        //准备一个协程,为客户端服务
        go process(conn)
    }
    
}

客户端功能:

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

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

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

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

package main

import (
    "fmt"
    "net"   //做网络socket开发时,net包含需要的所有方法和函数
    "bufio"
    "os"
)

func main()  {
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Printf("dial err, err = %v\n", err)
        return
    }
    fmt.Printf("dial success, success = %v\n", conn)
    //功能一: 客户端发送单行数据,然后退出
    reader := bufio.NewReader(os.Stdin) // os.Stdin 表示标准输入[终端]
    //从终端读取一行用户输入,并发送给服务器
    line, err := reader.ReadString('\n')
    if err != nil {
        fmt.Printf("readString err = %v\n", err)
    }
    //将line发送给服务器
    n, err := conn.Write([]byte(line))
    if err != nil {
        fmt.Printf("conn err =%v\n", err)
    }
    fmt.Printf("客户端发送了%d字节给服务器,并退出", n)
}

 对客户端代码进行改进,如下:

package main

import (
    "fmt"
    "net"   //做网络socket开发时,net包含需要的所有方法和函数
    "bufio"
    "os"
    "strings"
)

func main()  {
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Printf("dial err, err = %v\n", err)
        return
    }
    fmt.Printf("dial success, success = %v\n", conn)
    //功能一: 客户端发送单行数据,然后退出
    reader := bufio.NewReader(os.Stdin) // os.Stdin 表示标准输入[终端]

    for {
        //从终端读取一行用户输入,并发送给服务器
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Printf("readString err = %v\n", err)
        }
        //如果输入的是exit,则退出
        line = strings.Trim(line, "\r\n")
        if line == "exit" {
            fmt.Println("客户端退出")
            break
        }
        //将line发送给服务器
        n, err := conn.Write([]byte(line  + "\n"))
        if err != nil {
            fmt.Printf("conn err =%v\n", err)
        }
        fmt.Printf("客户端发送了%d字节给服务器,并退出", n)
    }
}

[上一节][go学习笔记.第十五章.反射,常量] 2.常量 

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

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

相关文章

镍离子去除专业吸附技术,深度除镍工程段工艺设计

含镍废水具有较大的复杂性,难以利用单一的处理方法进行有效处理,现多采用综合处理技术来实现其达标排放及资源的综合利用。 现有的含镍废水处理技术可分为传统化学法、物理法以及电化学法三类。 传统的化学法包括化学沉淀法以及絮凝法等,是通…

因果推理专题讨论01:因果推理概述

因果推理本质属于统计学范畴,并试图从根源上对基于相关性的统计学进行改革。当年诞生统计学科时就发生过分歧,因果被压下去了。直到最近,基于相关性的统计方法几乎发展到尽头,人工智能进一步发展,目前的统计工具已经难…

HTML5期末大作业:仿商城网站设计—— 绿色特产商城购物Html+Css+javascript的网页制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

外卖好评回复模板

好评回复很重要,客户花费时间写好评,如果可以得到商家用心的回复,会更增加客户的好感度,从而将客户转化为店铺忠实粉丝的概率会更大。 前言 在外卖评价上,很多店铺老板都比较重视差评回复,反而会比较忽视好…

【ML】关于什么是概率图模型?

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

Java程序员该如何进阶?资深阿里P8通过十年经验送你一些经验和建议!

献给迷茫中的你 我相信很多人都有过自己迷茫期,在开始学习之前会迷茫,会不知道自己要学什么,学这些有什么用;学习之后,学的不扎实,得不到认可,觉得自己白学了;真正找到一份还凑合的…

力扣(LeetCode)27. 移除元素(C++)

双指针 删除 valvalval 等价于将不等于 valvalval 的数按原来的顺序插入数组。 判断当前数和 valvalval 是否相等 。相等则跳过,向右遍历。不相等,则遇到非 valvalval 的数,插入待插入位置,待插入位置向右一位。 jjj 指向待插入…

【OpenDDS开发指南V3.20】第六章:内置主题

介绍 在 OpenDDS 中,默认情况下会创建和发布内置主题,以交换有关在部署中运行的 DDS 参与者的信息。 当使用 DCPSInfoRepo 服务在集中式发现方法中使用 OpenDDS 时,内置主题由该服务发布。 对于 DDSI-RTPS 发现,在进程中实例化的内部 OpenDDS 实现填充内置主题数据读取器…

es5下载安装x-pack修改密码

1.下载和es相同版本的x-pack 如果不是相同的版本会报错,页面会显示main问题 下载地址如下 Download X-Pack: Extend Elasticsearch and Kibana | Elastic 2.将下载下来的安装包传入到需要配置密码的服务器中 3.在es中安装xpack插件 记住x-pack插件无需解压 cd /…

计算机专业毕业论文设计与实现(论文+源码)_kaic

jspSSM201大学生第二课堂学分成绩活动报名vue.mp4jspSSM205旅游信息景点酒店购物车vue.mp4jspSSM206 篮球NBA周边商城vue.mp4jspSSM207办公OA考勤请假健康设备系统.mp4jspSSM208停车位短租系统vue.mp4jspSSM209大学生兼职跟踪系统vue.mp4jspSSM210的KTV点歌系统.mp4jspSSM211的…

高项 整体管理论文

六个过程: 1、制定项目章程:编写一份正式文件的过程,这份文件就是项目章程。通过发布项目章程,正式地批准项目并授权项目经理在项目活动中使用组织资源。 2,制定项目管理计划:定义、准备和协调所有子计划…

用busybox构建最小根文件系统详解

1、busybox源码获取 (1)busybox官网下载地址:https://busybox.net/; (2)建议下载busybox的版本:尽量和你使用的编译环境(比如:Ubuntu)的版本相近,版本差太多可能需要解决一些编译时候的兼容问题; 2、busybo…

从零开始做一款Unity3D游戏<二>——移动,相机控制与碰撞

移动玩家 玩家对象的创建 理解向量 获取玩家输入 相机跟随 使用Unity的物理系统 刚体运动 碰撞体和碰撞 使用碰撞体触发器 总结 本文主要来自<<C#实践入门>>哈里森.费隆 著&#xff0c;仅用为做笔记。 当玩家开始玩一款新的游戏时&#xff0c;要做的第一…

第3章 数据结构中树的概念

文章目录文档配套视频讲解链接地址第03章 树3.1 二叉树创建1. 实例20 二叉树创建3.2 二叉树遍历1. 二叉树的遍历2. 三种遍历算法3. 实例21 二叉树的遍历文档配套视频讲解链接地址 腾讯课堂视频链接地址 : 24_树与二叉树_树的理解腾讯课堂视频链接地址 : 25_树与二叉树_二叉树遍…

论文精读:End-to-End Semi-Supervised Object Detection with Soft Teacher

https://arxiv.org/pdf/2106.09018.pdf 半监督学习重在流程&#xff0c;而不在网络细节 Abstract 本文提出了一种端到端半监督目标检测方法&#xff0c;不同于以往更复杂的多阶段方法。端到端训练逐渐提高了训练过程的伪标签质量&#xff0c;越来越准确的伪标签进而有利于目…

法大大携手企企科技,助力企业实现全生命周期合同管理

伴随着企业信息化高速发展&#xff0c;打破信息孤岛实现全业务信息化的需求日益凸显&#xff0c;企企科技携手法大大&#xff0c;完善了客户从签署到项目管理全场景的信息化解决方案&#xff0c;全面助力客户实现项目管控信息化。“数字化技术对项目管理具有多角度、全方位的影…

6-JS的Fetch 跨域问题

跨域访问 只要协议、主机、端口之一不同&#xff0c;就不同源&#xff0c;例如 http://localhost:7070/a 和 https://localhost:7070/b 就不同源 同源检查是浏览器的行为&#xff0c;而且只针对 fetch、xhr 请求 如果是其它客户端&#xff0c;例如 java http client&#xff…

oracle开启归档日志并修改归档日志路径

一、归档日志概念 归档日志&#xff1a;非活动的重做日志&#xff0c;用来保存所有的重做历史记录。 什么时候写归档日志&#xff1a;当数据库处于archivelog模式并重做日志切换的时候&#xff0c;后台进程ARCH会启动将重做日志的内容完整的保存到归档日志中。 日志操作模式…

ZPM介绍(2)

发布您自己的软件 首先&#xff1a;要发布您的软件&#xff0c;您要支持这个”命名规范。其中和zmp最相关的是包名和l类名的设计&#xff0c;你要定义成这样&#xff1a; company.project.subpackage.TheClass.cls 如果您的Package Name定义是&#xff1a; Company.Project, 有…

元数据管理-解决方案调研二:元数据管理解决方案——Saas/内部解决方案(3)

Saas/内部解决方案 2.10、Netflix Metacat Metacat 是一种元数据服务&#xff0c;使数据易于发现、处理和管理。在 Netflix&#xff0c;数据仓库由存储在 Amazon S3&#xff08;通过 Hive&#xff09;、Druid、Elasticsearch、Redshift、Snowflake 和 MySql 中的大量数据集组…