golang中的网络编程

1、网络编程

1.1、网络编程基本介绍
在这里插入图片描述
1.2、OSI与Tcp/Ip参考模型
在这里插入图片描述
1.3、Ip地址
在这里插入图片描述
1.4、端口(port)介绍
在这里插入图片描述
在这里插入图片描述
1.4.1、端口分类
在这里插入图片描述
1.4.2、端口(port)使用注意
在这里插入图片描述在这里插入图片描述
1.5、tcp socket编程的客户端和服务器端
在这里插入图片描述

2、tcp socket编程快速入门
2.1、服务端的处理流程
在这里插入图片描述
2.2、客户端的处理流程
在这里插入图片描述
2.3、简单的程序示意图
在这里插入图片描述
2.4、代码实现
在这里插入图片描述

package main

import (
	"fmt"
	"net"
)

/**
 *  @Description:网络编程 编写服务端,在8888端口端口监听 可以和多个客户端建议链接
 *  @Author: guai
 *  @Date:2020/2/27 21:55
**/

//服务端
func process(conn net.Conn) {
	//采用延迟机制关闭conn连接
	defer conn.Close()

	for {
		//创建一个切片
		buf := make([]byte, 1024)
		//1、等待客户端通过conn连接发送消息
		//2、如果客户端没有 write【发送】,那么协程就会阻塞在这里
		fmt.Println("waiting for client messages")
		//从conn中读取 客户端发送的值
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("client exist err:", err)
			return
		}
		//3、显示客户端发送的内容到服务器的终端 (控制台)
		fmt.Println("client message:", string(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
	}
	//采用延迟机制关闭 jianting
	defer listen.Close()
	//循环等待客户端来连接
	for {
		//等待客户端连接
		fmt.Println("waitin connect")
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("Accept() err=", err)
		} else {
			fmt.Printf("accept() suc con=%v 客户端ip=%v\n", conn, conn.RemoteAddr().String())
		}
		//准备一个协程为客户端服务
		go process(conn)
	}

}

运行结果:

在这里插入图片描述
在这里插入图片描述

package main

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

/**
 *  @Description: 编写一个客户端与服务端连接并通信
 *  @Author: guai
 *  @Date:2020/2/27 22:12
**/
func main() {
	//拨号 与指定ip的指定端口连接
	conn, err := net.Dial("tcp", "192.168.43.52:8888")
	if err != nil {
		fmt.Println("client dial err:", err)
		return
	}

	fmt.Printf("connect %v success! plase input message:",conn.RemoteAddr())

	//功能一:客户端发送单行数据,然后退出
	//os.Stdin 表示标准输入【终端】
	reader := bufio.NewReader(os.Stdin)
	//从终端读取一行用户输入 并准备发送给服务器
	line, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("readString err:", err)
	}
	n, err := conn.Write([]byte(line))
	if err != nil {
		fmt.Println("conn.Writer err:", err)
	}
	fmt.Println("客户端发送了", n, "字节数据并退出")
}

结果:
客户端:
在这里插入图片描述
服务端:
在这里插入图片描述
2.4.1、升级客户端 客户端可发送多条消息当输入exit退出

package main

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

/**
 *  @Description:可以发送多条信息的客户端 并通过输入exit退出
 *  @Author: guai
 *  @Date:2020/2/27 22:52
**/
func main() {
	//拨号与 指定ip的端口建立连接
	con, err := net.Dial("tcp", "0.0.0.0:8888")

	if err != nil {
		fmt.Println("connect fail err:", err)
		return
	}
	fmt.Printf("contect with %v,please input:(if input 'exit' will exit)\n", con.RemoteAddr())
	//创建标准输入流 os.Stdin表示从终端(控制台输入)
	reader := bufio.NewReader(os.Stdin)
	for {
		//获取从控制台输入的数据以回车结束
		line, err := reader.ReadString('\n')
		line = strings.Trim(line, "\r\n")
		if err != nil {
			fmt.Println("read err:", err)
		}
		if line == "exit" {
			break
		}
		n, err := con.Write([]byte(line))
		if err != nil {
			fmt.Println("conn write err:", err)
		} else {
			fmt.Printf("send %d bytes success\n", n)
		}
	}
	fmt.Println("exit")

}

结果:
客户端:
在这里插入图片描述
服务端:
在这里插入图片描述
部分图片来自 Go语言-尚硅谷_韩顺平_Go语言核心编程.pdf 如需我删除,可以留言或者私聊哟
磕头ing

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值