go-网络编程

go-网络编程

基本介绍

  1. golang的主要设计目标之一就是面向大规模后端服务器程序,网络通信这块是服务端程序必不可少的,也是至关重要的
  2. 网络编程有两种
    1. TCP socket编程,是网络编程的主流。之所以叫Tcp socket编程,是因为底层是基于TCP/IP协议的
    2. b/s结构的http编程,使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用tcp socket实现的

基本知识

  1. TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际或联网的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的

image-20220514134624070

image-20220514140124137

  1. ip地址:每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,ip地址有ipv4(32位)或者ipv6(128位)。
  2. 端口port:
    1. 只要是做服务程序,都必须监听一个端口
    2. 端口就是其他程序和该服务通讯的通道
    3. 一个计算机有65535个端口 1-65535
    4. 一旦一个端口被某个程序监听(占用),那么其他的程序就不能在该端口监听
    5. 分类:
      1. 0号是保留端口
      2. 1-1024是固定端口或有名端口
      3. 1025-65535是动态端口
    6. 注意事项:
      1. 在计算机要尽可能的少开端口
      2. 一个端口只能被一个程序监听
      3. 若使用netstat -an可以查看本机中有哪些端口在监听
      4. 可以使用netstat -anb来查看监听端口的pid,再结合任务管理器关闭不安全的端口

快速入门

处理流程

  1. 服务端的处理流程
    1. 监听端口 8888
    2. 接收客户端的tcp连接,建立客户端和服务端的链接
    3. 创建goroutine,处理该连接的请求
  2. 客户端的处理流程
    1. 建立与服务器端的链接
    2. 发送请求数据,接收服务器端返回的结果数据
    3. 关闭链接
package main

import (
	"fmt"
	"io"
	"net"
)

func main() {
	// 监听
	// net.Listen("tcp", "0.0.0.0:8888")
	// 1. tcp 表示网络协议
	// 2. 0.0.0.0:8888 表示本地监听 8888端口
	listener, err := net.Listen("tcp", "0.0.0.0:8888")
	if err != nil {
		fmt.Println("listener err: ", err)
		return
	}

	defer listener.Close() // 延迟关闭监听器listener

	// 循环等待链接
	for {
		// 等待连接
		fmt.Println("等待客户端连接")
		conn, err2 := listener.Accept()
		if err2 != nil {
			fmt.Println("accept err2: ", err2)
		} else {
			fmt.Printf("success conn: %v\n", conn)
			go proccess(conn)
		}

	}

}

func proccess(conn net.Conn) {
	// 循环接收客户端发送的数据
	defer conn.Close()

	for {
		// 创建一个切片
		buf := make([]byte, 1024)
		// conn.Read(buf)
		// 1. 等待客户端通过conn发送信息
		// 2. 若客户端没有wri't
		n, err := conn.Read(buf)
		if err != nil && err != io.EOF {
			fmt.Printf("server conn read err: %v\n", err)
		} else if err == io.EOF {
			fmt.Printf("%v client exit", conn.RemoteAddr())
			return
		}

		// 显示客户端发送的数据到终端
		fmt.Print(conn.RemoteAddr(), ": ")
		fmt.Println("client Data : ", string(buf[:n]))

		switch string(buf[:n]) {
		case "hello\n":
			conn.Write([]byte("hello"))
		case "go\n":
			conn.Write([]byte("study golang"))
		case "dlmu\n":
			conn.Write([]byte("211 school"))
		default:
			conn.Write([]byte("I don't know"))
		}

	}
}
package main

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

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

	defer conn.Close()

	fmt.Printf("client success conn: %v\n", conn)

	for {
		// 将命令行中的输入的内容发送给服务器端
		reader := bufio.NewReader(os.Stdin)
		line, err2 := reader.ReadString('\n')
		if err2 != nil {
			fmt.Println("readString err: ", err2)
		}

		if line == "exit\n" {
			break
		}
		// 向服务器端发送数据
		_, err3 := conn.Write([]byte(line))
		if err3 != nil {
			fmt.Println("conn.Write err: ", err3)
		}

		// 接收服务器发送的数据
		buf := make([]byte, 1024)
		n, err4 := conn.Read(buf)
		if err4 != nil {
			fmt.Println("client read err: ", err4)
		}
		fmt.Printf("server: %v\n", string(buf[:n]))

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoaringW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值