当前位置:   article > 正文

Golang TCP编程

golang tcp编程


1. 客户端和服务器模型

在这里插入图片描述

  • socket: BSD UNIX的进程通信机制,通常也称作“套排字”,用于描述IP地址和端口,是一个通信链的句柄。
  • socket 可以理解为 TCP/IP 网络的API,它定义了许多函数,程序员可以使用它来开发TCPIP网络的应用程序。
  • 计算机上运行对的应用程序通常通过“套接字"向网络发出请求或者应答网络请求。

在这里插入图片描述

  • 服务端处理流程:
    ① 监听端口
    ② 接收客户端连接
    ③ 创建goroutine,处理此连接
  • 客户端处理流程:
    ① 建立与服务端连接
    ② 进行数据收发

Apache是同步模型,Nginx是异步模型

在这里插入图片描述

2. 服务器端配置

一个服务端连接多个客户端,例如:世界各地的用户使用自己电脑的浏览器访问淘宝网。

示例:

package main

import (
	"fmt"
	"net"
)

//处理客户端连接请求
func process(coon net.Conn) {
	defer coon.Close()
	//定义接收信息的字节数组
	var buf [1024]byte
	//读取数据
	n, err := coon.Read(buf[:])
	if err != nil {
		fmt.Println("获取信息失败,err:", err)
		return
	}
	fmt.Printf("对方回复信息是:%s", string(buf[:n]))
}

//TCP服务端配置
func main() {
	//1:启用监听
	listener, err := net.Listen("tcp", "127.0.0.1:20000")
	//连接失败处理
	if err != nil {
		fmt.Println("启动服务失败,err:", err)
		return
	}

	//程序退出时释放端口
	defer listener.Close()
	for {
		conn, err := listener.Accept() //2.建立连接
		if err != nil {
			fmt.Println("接收客户连接失败,err:", err)
			continue
		}
		//3.启动一个人goroutine处理客户端连接
		go process(conn)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

3. 客户端配置

package main

import (
	"fmt"
	"net"
)

//TCP客户端
func main() {
	//1:拨号方式建立与服务端连接
	conn, err := net.Dial("tcp", "127.0.0.1:20000")
	if err != nil {
		fmt.Println("连接服务端失败,err:", err)
		return
	}

	//注意:关闭连接位置,不能写在连接失败判断上面
	defer conn.Close()
	//2:向server发送信息
	//fmt.Fprintln(conn,("hello,tom"))
	_, err = conn.Write([]byte("hello,tom"))
	if err != nil {
		fmt.Println("发送信息失败,err:", err)
		return
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

测试结果如下:

连接成功:
在这里插入图片描述
在这里插入图片描述

连接失败:
在这里插入图片描述

  • 客户端优化聊天模式:

客户端

package main

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

//TCP客户端
func main() {
	//1:拨号方式建立与服务端连接
	conn, err := net.Dial("tcp", "127.0.0.1:20000")
	if err != nil {
		fmt.Println("连接服务端失败,err:", err)
		return
	}

	//注意:关闭连接位置,不能写在连接失败判断上面
	defer conn.Close()

	//控制台输入
	reader := bufio.NewReader(os.Stdin)
	input, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("控制台输入失败,err:", err)
		return
	}
	//2:向server发送信息
	//fmt.Fprintln(conn,("hello,tom"))
	_, err = conn.Write([]byte(input))
	if err != nil {
		fmt.Println("发送信息失败,err:", err)
		return
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

服务端

package main

import (
	"fmt"
	"net"
)

//处理客户端连接请求
func process(coon net.Conn) {
	defer coon.Close()
	//定义接收信息的字节数组
	var buf [1024]byte
	//读取数据
	n, err := coon.Read(buf[:])
	if err != nil {
		fmt.Println("获取信息失败,err:", err)
		return
	}
	fmt.Printf("对方回复信息是:%s", string(buf[:n]))
}

//TCP服务端配置
func main() {
	//1:启用监听
	listener, err := net.Listen("tcp", "127.0.0.1:20000")
	//连接失败处理
	if err != nil {
		fmt.Println("启动服务失败,err:", err)
		return
	}

	//程序退出时释放端口
	defer listener.Close()
	for {
		conn, err := listener.Accept() //2.建立连接
		if err != nil {
			fmt.Println("接收客户连接失败,err:", err)
			continue
		}
		//3.启动一个人goroutine处理客户端连接
		go process(conn)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 测试结果如下:

在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号