【原创】go语言学习(二十二)网络编程

目录

  • TCP/IP协议介绍
  • GO快速实现TCP服务端
  • GO快速实现TCP客户端
  • UDP协议介绍
  • UDP编程实例

TCP/IP协议介绍

1、互联网起源

A. 起源于美国五角大楼,它的前身是美国国防部高级研究计划局主持研制的ARPAnet。
B. 互联网的基础是TCP/IP协议
C. TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

2、TCP/IP协议

A. TCP (传输控制协议) - 应用程序之间通信。
B. UDP (用户数据包协议) - 应用程序之间的简单通信
C. IP (网际协议) - 计算机之间的通信。
D. DHCP (动态主机配置协议) - 针对动态寻址。

3、TCP协议

A. 面向连接的协议
B. 可靠传输,发送的数据保证对方能够收到。
C. 保证时序,发送的数据按发送的顺序到达。
D. 全双工的。

4、IP协议

A. 用于计算机之间进行通信,是TCP/UDP协议的底层
B. IP是无连接的,负责把数据包路由到目的地。

5、 TCP/IP协议图解

 

 

6、 TCP协议基础

A. 通过IP和端口进行计算机之间进行访问
B. 域名和知名端口,http:80,https:443,ssl:22端口等

7、Tcp服务端编程模型

 

 

GO快速实现TCP服务端

1、服务端处理流程

 

 

package main

import (
	"fmt"
	"net"
)

func main(){
	listen, err := net.Listen("tcp", "0.0.0.0:20000")

	if err != nil {
		fmt.Println("listen failed, err:", err)
	}

	for {
		conn, err := listen.Accept()
		if err !=nil {
			fmt.Printf("accept failed, err:%v\n", err)
			continue
		}
		go process(conn)
	}
}

func process(conn net.Conn){
	defer conn.Close()
	for {
		var buf [128]byte
		n, err := conn.Read(buf[:])
		if err != nil {
			fmt.Printf("read form conn failed, err:%v", err)
			break;
		}

		str := string(buf[:n])
		fmt.Printf("recv from client, data:%v\n", str)
	}
}

   

GO快速实现TCP客户端

1、客户端编程模式

 

package main

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

func main(){
	conn, err := net.Dial("tcp", "0.0.0.0:20000")
	if err != nil {
		fmt.Printf("dial failed, err:%v\n", err)
		return
	}

	reader := bufio.NewReader(os.Stdin)
	for {
		data,err := reader.ReadString('\n')
		if err != nil {
			fmt.Printf("read from console failed, err:%v\n", err)
		}

		data = strings.TrimSpace(data)
		_, err =conn.Write([]byte(data))
		if err != nil {
			fmt.Printf("write failed, err%v\n", err)
		}
	}
}

  

2、发送HTTP请求

A. HTTP协议是基于TCP协议之上的文本协议。
B. 每行文本使用\r\n结尾,当连续两个\r\n时,表示整个数据包结束。

package main

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

func main(){
	conn, err := net.Dial("tcp", "www.baidu.com:80")
	if err != nil {
		fmt.Printf("dial failed, err:%v\n", err)
		return
	}

	data := "GET / HTTP/1.1\r\n"
	data += "HOST: www.baidu.com\r\n"
	data += "connection:close\r\n"
	data += "\r\n\r\n"

	_, err = io.WriteString(conn, data)
	if err != nil {
		fmt.Printf("wirte string failed, err:%v\n", err)
		return
	}

	var buf [1024]byte
	for {
		n, err := conn.Read(buf[:])
		if err != nil || n == 0 {
			break
		}
		fmt.Println(string(buf[:n]))
	}
}

  

UDP协议介绍

1、UDP协议

A. 用户数据库报协议
B. 无连接,直接进行数据发送
C. 不可靠、没有时序
D. 实时性比较好,通常用于视频直播相关领域。

UDP编程实例

1、服务端代码

package main
import (
    "fmt"
    "net"
)
func main() {
    // 创建监听
    socket, err := net.ListenUDP("udp4", &net.UDPAddr{
        IP: net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("监听失败!", err)
        return
    }
    defer socket.Close()
    for {
        // 读取数据
        data := make([]byte, 4096)
        read, remoteAddr, err := socket.ReadFromUDP(data)
        if err != nil {
            fmt.Println("读取数据失败!", err)
            continue
        }
        fmt.Println(read, remoteAddr)
        fmt.Printf("%s\n\n", data)
        // 发送数据
        senddata := []byte("hello client!")
        _, err = socket.WriteToUDP(senddata, remoteAddr)
        if err != nil {
            return
            fmt.Println("发送数据失败!", err)
        }
    }
}

  

2、客户端代码

package main

import (
	"fmt"
	"net"
)

func main(){
	// 创建连接
	socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
		IP:   net.IPv4(127,0,0,1),
		Port: 8080,
	})
	if err !=nil {
		fmt.Println("连接失败!", err)
		return
	}
	defer socket.Close()
	// 发送数据
	senddata := []byte("hello server!")
	_, err = socket.Write(senddata)
	if err != nil{
		fmt.Println("发送数据失败!", err)
		return
	}

	//接收数据
	data := make([]byte, 4096)
	read, remoteAddr, err := socket.ReadFromUDP(data)
	if err != nil {
		fmt.Println("读取数据失败!", err)
		return
	}
	fmt.Println(read, remoteAddr)
	fmt.Printf("%s\n", data)
}

  

posted @ 2019-11-08 15:56  shuyang  阅读(274)  评论(0编辑  收藏  举报