2022/02/15   又熬夜了又熬夜了....

今天主要学习了go的网络变成,可以把第一段代码视为笔记,第二段代码块视为demo

//1. client
package mainimport ("bufio""fmt""net""os""strings"
)func main() {//1.用dial, 链接指定的地址,端口号conn, err := net.Dial("tcp", "192.168.1.103:8888")if err != nil {fmt.Println("客户端链接失败,直接退出")return}//2.链接成功,延时关闭conndefer conn.Close()//3.循环向客户端发送数据var reader *bufio.Readerfor {reader = bufio.NewReader(os.Stdin) //从键盘获取字符//从reader中获取一行用户输入的字符串发送给服务器line, err := reader.ReadString('\n')if err != nil {fmt.Println("从reader读取字符串错误: ", err)}line = strings.TrimSpace(line)if line == "quit" {return}//4.将获取到的string类型的line 转换字节切片写入conn中n, err := conn.Write([]byte(line))if err != nil {fmt.Println("写入conn错误: ", err)}fmt.Printf("客户端成功发送了%d个数据...\n", n)}
}
//1.serverpackage mainimport ("fmt""net""strings"
)func process(conn net.Conn) {//4.延时关闭conndefer conn.Close()//5.开始接收数据打印数据for {buf := make([]byte, 1024) //缓存信息切片fmt.Println("等待客户端输入数据")n, err := conn.Read(buf) //读取conn中的数据到buf中if err != nil {          //读取有错误,超时或者客户端退出fmt.Println("读取有错误,超时或者客户端退出")//关闭协程return}//显示收到的客户端的信息,打印到终端,如果是quit,就退出fmt.Print(string(buf[:n]))buff := strings.TrimSpace(string(buf[:n]))if buff == "quit" {fmt.Println("客户端退出程序!")return} else {fmt.Println("客户端发送的消息: ", buff)}/*这里需要说明一下,为什么是读取buf[:n],而不是buf呢返回的n是有效字符的个数,buf[:n]里面就是我们客户端输入的东西如果是buf,就会把我们的1024个字节空间没有字符的也会输出demo:假设这是buf的值      hello0000buf[:n]               hellobuf                hello0000当然内存中并不一定是0,都是垃圾值,没必要读*/}
}func main() {//1.先listen监听本地接口listen, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("监听发生错误, err= ", err)return //监听错误就没有必要进行下面的东西了}//2.延时关闭listendefer listen.Close()//3.等待客户端连接,开始循环Accept()for {fmt.Println("循环等待客户端链接...")conn, err := listen.Accept()if err != nil { //有客户端链接错误,但是不影响其他客户端fmt.Println("Accept 错误")} else { //链接成功就打印客户端的信息,ip地址fmt.Println("链接成功的客户端信息: ", conn.RemoteAddr().String())}//链接成功就开启一个协程,为客户端服务go process(conn)}
}

=========================================================================

//2.clientpackage mainimport ("bufio""fmt""net""os"
)func main() {conn, err := net.Dial("tcp", "192.168.1.103:8888")if err != nil {fmt.Println("client dial err = ", err)return}defer conn.Close()fmt.Println("client dial success , conn = ", conn)//1.客户端可以发送单行数据,然后就退出reader := bufio.NewReader(os.Stdin) //Stdin、Stdout和Stderr是指向标准输入、标准输出、标准错误输出的文件描述符。//从终端读取一行用户的输入并准备发送给服务器line, err := reader.ReadString('\n')if err != nil {fmt.Println("reader string err", err)}fmt.Println("input your message...")//2.在控制台输入一段话,发送到服务器终端打印n, err := conn.Write([]byte(line))if err != nil {fmt.Println("conn.Write err = ", err)}fmt.Printf("client send %d byte, quit\n", n)
}
//2.serverpackage mainimport ("fmt""net" //做网络socket变成,net包满足所有我们需要的方法和函数
)func process(conn net.Conn) {//这里我们循环的接收客户端发送的数据defer conn.Close() //处理完一定要关闭for {buf := make([]byte, 1024)//1.等待客户端通过conn发送信息//2.如果客户端没有write[发送],那么协程就阻塞在这里fmt.Printf("server waiting %s send message...", conn.RemoteAddr().String())n, err := conn.Read(buf) //从conn读取if err != nil {          //超时,链接断开,协程就会退出fmt.Println("server read err: ", err)return //读的时候有可能出错,超时或者客户端关闭,就结束协程}//3.显示客户端发送的内容到服务器的终端fmt.Print(string(buf[:n])) //buf[:n]是管道里面真正的东西}
}func main() {fmt.Println("服务器开始监听....")//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 = ", err)return}defer listen.Close() //延时关闭fmt.Printf("listen = %v\n", listen)//循环等待客户端来连接我for {//等待客户端连接fmt.Println("等待客户端来链接...")conn, err := listen.Accept()if err != nil { //一个链接出错不需要return,其他链接可能正常fmt.Println("Accept() error = ", err)} else {fmt.Println("Accept() success  conn = ", conn)fmt.Println("client ip = ", conn.RemoteAddr().String())}//这里准备起一个协程,为客户端服务go process(conn)}}

GO语言学习之路24相关推荐

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. Go语言学习之路(二)

    Go语言学习之路(二) 面对对象编程思想 抽象 封装 继承 接口 文件 命令行参数 Json 序列化 反序列化(unmarshal) 单元测试 Redis Redis简介 Redis基本使用 Go连接 ...

  3. Qt学习之路(24): QPainter(改写paintEvent)

    Qt学习之路(24): QPainter(改写paintEvent) 多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写 ...

  4. C语言-学习之路-01

    C语言学习之路-01 目录 关键字 数据类型 常量 变量 声明和定义 进制 sizeof关键字 整型:int short.int.long.long long 字符型:char ASCII对照表 转义 ...

  5. C语言学习之路--计算机系统组成以及工作原理,进制之间的转换和机器数及其表示范围

    目录 一.前言 二.计算机系统组成以及工作原理简介 1.硬件系统基本组成原理及工作原理 2.硬件各部分详解 1.运算器 2.控制器 CPU 3.存储器 1.内存储器 2.外存储器 3.拓展 4.存储器 ...

  6. Go语言学习之路——Go语言简介

    本文首发于我的博客 很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东 ...

  7. C语言学习之路--函数,从知识到实战

    目录 一.前言 二.函数是什么? 三.C语言中函数的分类 1.库函数 1.为什么会有库函数? 2.如何学习库函数? 3.学习库函数举例 1.strcpy 2.memset 3.库函数学习工具总结 2. ...

  8. C语言学习之路--C语言中的格式输出

    一.前言 在我们初学C语言的过程中,会有一些类似%d之类的格式输出,我在此做个汇总,供大家学习. 二.分类 1.%u 十进制无符号整数. 2.%f 表示输出浮点数. 可以通过输出格式说明符来指定精确到 ...

  9. R语言学习之路——进入R的大门

    数据分析之R语言 基础统计指标 指标 描述 均值(mean) 即平均数,mean=1/n*sum(X1:Xn);均值能够利用所有已知信息,但是对异常值(极小或极大值)很敏锐: 中位数(median) ...

最新文章

  1. Django celery6.4
  2. 睡眠好不在于8小时,关键是满足「睡眠周期」
  3. Linux电源管理(10)_autosleep
  4. P1131-[ZJOI2007]时态同步【树形dp】
  5. leetcode132. 分割回文串 II
  6. vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)
  7. 2020,这些前沿技术成全球关注热点
  8. C#LeetCode刷题之#58-最后一个单词的长度(Length of Last Word)
  9. php探针存在xss漏洞
  10. 修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题
  11. Mybatis-学习笔记(5)动态SQL
  12. 苹果无线网服务器改什么速度快,iPhone网速慢怎么办?苹果手机如何配置DNS?
  13. kubectl命令补全
  14. 2020计算机行业就业职位及分析
  15. 周易内核与计算机原理,周易原理之我说(一)
  16. 手机浏览器类型ua php,通过userAgent判断手机浏览器类型(示例代码)
  17. 2022北京冬奥会开幕式里的黑科技,闪耀闪耀全世界
  18. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...
  19. 利用C/C++实现贪吃蛇
  20. Oracle 插入insert语句

热门文章

  1. 到底是谁革了手机的命?!
  2. 荣耀路由器3pro虚拟服务器,荣耀路由器Pro游戏加速功能怎么用
  3. uniapp微信小程序 map地图markers图标不显示,markers图标真机调试不显示
  4. oracle中自定义函数如何使用,oracle自定义函数语法及使用
  5. Python对象及内存管理
  6. 在mac OS安装Android SDK教程
  7. 驱动中动态创建设备号、设备节点
  8. 福利吧简约朴素网站地址发布页源码
  9. 如何使用并行计算来加速并行计算中的分布式计算优化?
  10. 用jquery实现平滑的页面滚动效果