网络编程

网络通信——tcp/ip协议arrow-up-right

socket编程

Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。

图解

### tcp协议

TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

服务端

/**
 * Createby GoLand
 * User xzw [email protected]
 * Date 2021/8/8
 * Time 上午10:27
 */

package main

import (
   bufio
   fmt
   io
   log
   net

   imooc.com/ccmouse/learngo/net/protocol
)

func main() {
   listen, err := net.Listen(tcp, 127.0.0.1:8080) // 监听端口
   if err != nil {
      log.Fatal(listen failed, err:, err)
   }
   for {
      conn, err := listen.Accept() // 建立连接
      if err != nil {
         log.Println(accept failed, err:, err)
         continue
      }
      go process(conn) // 启动一个 goroutine 处理连接
   }
}

func process(conn net.Conn) {
   defer conn.Close()
   for {
      reader := bufio.NewReader(conn)

      msg, err := protocol.Decode(reader)
      if err == io.EOF {
         return
      }
      if err != nil {
         log.Println(decode msg failed, err:, err)
         return
      }
      fmt.Println(收到client发来的数据:, msg)
      data, err := protocol.Encode(msg)
      if err != nil {
         log.Println(encode msg failed, err:, err)
         return
      }
      conn.Write(data)
   }
}

客户端

粘包拆包

udp协议

用户数据报协议(User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报(package-oriented)的传输层协议。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验。

服务端

客户端

最后更新于