Go语言之socket编程

拥有回忆 提交于 2020-02-08 00:56:05

socket编程

服务端的处理流程

  • a. 监听端口(为什么一般没有,因为默认是80,隐藏了)
  • b. 接收客户端的链接
  • c. 创建goroutine,处理该链接

客户端的处理流程

  • a. 建立与服务端的链接
  • b. 进行数据收发
  • c. 关闭链接

网络协议

TCP/IP协议

一般默认为4层即可:链路层、网络层、传输层、应用层

	链路层:处理MAC地址,设备到设备
	网络层:处理IP地址,主机到主机
	传输层:处理数据传输,进程到进程
	应用层:处理应用,应用程序

层和协议

每一层自己的协议
在这里插入图片描述

	链路层
		ARP:设备到设备(网卡、MAC),通过ip找mac
	网络层
		ping 172.0.0.1
	传输层
		TCP:文件传输、安全、慢
		UPD:例如聊天相关、不安全、快

复习知识

  • 网卡:网卡就是标识,网卡地址—>物理地址(MAC),广播时为了避免广播风暴,根据ip,仅在当前局域网内寻找目的mac地址

打包解包

在这里插入图片描述

C/S模型

  • 客户机-服务机模型
    在这里插入图片描述

服务端例子

package main

import (
	"fmt"
	"net"
)

func main() {
	// 监听
	listener, err := net.Listen("tcp", "192.0.0.1:8000")
	if err != nil {
		fmt.Println("err:", err)
	}

	defer listener.Close()

	// 阻塞等待用户链接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	// 接受用户的请求
	buf := make([]byte, 1024)
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	fmt.Printf("%s", string(buf[:n]))
}

用户端例子

package main

import (
	"fmt"
	"net"
)

func main() {
	// 连接到服务器
	conn, err := net.Dial("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("err:", err)
		return
	}

	defer conn.Close()

	// 发送数据
	conn.Write([]byte("Are you ok?"))

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!