Golang的网络编程

网络编程

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

两种网络编程

TCP socket编程

TCP socket编程,是网络编程的主流。之所以叫Tcp socket编程,是因为底层是基于Tcp/ip协议的.比如:QQ聊天

Golang的网络编程_第1张图片
服务端的处理
  1. 监听端口
  2. 接收客户端的tcp链接,建立客户端和服务器端的链接.
  3. 创建goroutine,处理该链接的请求(通常客户端会通过链接发送请求包)
客户端的处理流程
  1. 建立与服务端的链接
  2. 发送请求数据,接收服务器端返回的结果数据
  3. 关闭链接
Golang的网络编程_第2张图片
//服务端
package main

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

func process(conn net.Conn) {

   //循环接收客户端发送的数据
   defer conn.Close() //关闭conn

   for {
      //创建一个切片
      buf := make([]byte, 1024)
      // conn.Read(buf)
      //1. 等待客户端 通过 conn 发送信息
      //2. 如果客户端没有write[发送] ,那么协程就阻塞 在这里
      //fmt.Printf("服务器在等待客户端 %s 发送信息\n", conn.RemoteAddr().String())
      n, err := conn.Read(buf) //从conn读取
      if err != nil {
         fmt.Println("客户端退出", err)
         return
      }
      //3.显示客户端发送的内容到服务端的终端
      fmt.Print(string(buf[:n]))
   }
}

func main() {
   fmt.Println("服务器开始监听...")
   //net.Listen("tcp", "0.0.0.0:8888")
   //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() //延时关闭

   //循环等待
   for {
      fmt.Println("等待客户端来连接...")
      conn, err := listen.Accept() //等待客户端连接
      if err != nil {
         fmt.Println("Accept() err = ", err)
      } else {
         fmt.Printf("Accept() suc  conn=%v 客户端ip= %v \n ", conn, conn.RemoteAddr().String())
      }
      //这里准备一个协程,为客户端
      go process(conn)
   }

   fmt.Printf("listen suc = %v", listen)

}
//客户端
package main

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

func main() {
   conn, err := net.Dial("tcp", "127.0.0.1:8888")
   if err != nil {
      fmt.Println("client dial err=", err)
      return
   }
   fmt.Println("conn 成功 conn=", conn)

   //功能一:客户端可以发送单行数据,然后就退出
   reader := bufio.NewReader(os.Stdin) //表示标准输入【终端】

   for {

      //从终端读取一行用户输入,并准备发送给服务器
      line, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("readString err=", err)
      }

      //如果输入 exit 退出
      line = strings.Trim(line, " \r\n")
      if line == "exit" {
         fmt.Println("客户端退出...")
         break
      }

      //将line 发送给 服务器
      _, err = conn.Write([]byte(line + "\n"))
      if err != nil {
         fmt.Println("write err=", err)
      }
      //fmt.Printf("客户端发送了 %d 字节的数据,并退出", n)
   }
}
b/s结构的http编程

b/s结构的http编程,我们使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用tcp socket实现的。比如:京东商城【这属于go web开发范畴】

本人博客地址

你可能感兴趣的:(Golang,golang,网络,网络协议)