Go语言进阶第06天(TCP请求传输与监听)

1.服务器监听TCP请求

package main

import (
	"fmt"
	"net"
)

func main01() {
    
    
	// 指定服务器 通信协议、IP地址、port。 创建一个用于监听的 socket
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
    
    
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listener.Close()

	fmt.Println("服务器等待客户端建立连接...")
	// 阻塞监听客户端连接请求, 成功建立连接,返回用于通信的socket
	conn, err := listener.Accept()
	if err != nil {
    
    
		fmt.Println("listener.Accept() err:", err)
		return
	}
	defer conn.Close()
	fmt.Println("服务器与客户端成功建立连接!!!")
	// 读取客户端发送的数据
	buf := make([]byte, 4096)
	n, err := conn.Read(buf)
	if err != nil {
    
    
		fmt.Println("conn.Read err:", err)
		return
	}
	conn.Write(buf[:n]) // 读多少写多少。原封不动
	// 处理数据—— 打印
	fmt.Println("服务器读到数据:", string(buf[:n]))
}

2.客户端发送TCP请求

package main

import (
	"fmt"
	"net"
)

func main02() {
    
    
	// 指定 服务器 IP + port 创建 通信套接字。
	conn, err := net.Dial("tcp", "127.0.0.1:8000")
	if err != nil {
    
    
		fmt.Println("net.Dial err:", err)
		return
	}
	defer conn.Close()

	// 主动写数据给服务器
	conn.Write([]byte("Are you Ready?"))

	buf := make([]byte, 4096)
	// 接收服务器回发的数据
	n, err := conn.Read(buf)
	if err != nil {
    
    
		fmt.Println("conn.Read err:", err)
		return
	}
	fmt.Println("服务器回发:", string(buf[:n]))
}

3.CS并发服务器

package main

import (
	"fmt"
	"net"
	"strings"
)

func HandlerConnect(conn net.Conn) {
    
    

	defer conn.Close()

	// 获取连接的客户端 Addr
	addr := conn.RemoteAddr()
	fmt.Println(addr, "客户端成功连接!")

	// 循环读取客户端发送数据
	buf := make([]byte, 4096)
	for {
    
    
		n, err := conn.Read(buf)
		//fmt.Println(buf[:n])
		if "exit\n" == string(buf[:n]) || "exit\r\n" == string(buf[:n]) {
    
    
			fmt.Println("服务器接收的客户端退出请求,服务器关闭")
			return
		}
		if n == 0 {
    
    
			fmt.Println("服务器检测到客户端已关闭,断开连接!!!")
			return
		}
		if err != nil {
    
    
			fmt.Println("conn.Read err:", err)
			return
		}
		fmt.Println("服务器读到数据:", string(buf[:n])) // 使用数据

		// 小写转大写,回发给客户端
		conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
	}
}

func main03() {
    
    
	// 创建监听套接字
	//listener, err := net.Listen("tcp", "127.0.0.1:8001")
	listener, err := net.Listen("tcp", "192.168.15.78:8001")
	if err != nil {
    
    
		fmt.Println("net.Listen err:", err)
		return
	}
	defer listener.Close()

	// 监听客户端连接请求
	for {
    
    
		fmt.Println("服务器等待客户端连接...")
		conn, err := listener.Accept()
		if err != nil {
    
    
			fmt.Println("listener.Accept err:", err)
			return
		}
		// 具体完成服务器和客户端的数据通信
		go HandlerConnect(conn)
	}
}

4.CS并发客户端

package main

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

func main04() {
    
    
	// 主动发起连接请求
	conn, err := net.Dial("tcp", "192.168.15.78:8001")
	if err != nil {
    
    
		fmt.Println("net.Dial err:", err)
		return
	}
	defer conn.Close()
	// 获取用户键盘输入( stdin ),将输入数据发送给服务器
	go func() {
    
    
		str := make([]byte, 4096)
		for {
    
    
			n, err := os.Stdin.Read(str)
			if err != nil {
    
    
				fmt.Println("os.Stdin.Read err:", err)
				continue
			}
			//写给服务器, 读多少,写多少!
			conn.Write(str[:n])
		}
	}()

	// 回显服务器回发的大写数据
	buf := make([]byte, 4096)
	for {
    
    
		n, err := conn.Read(buf)
		if n == 0 {
    
    
			fmt.Println("检查到服务器关闭,客户端也关闭")
			return
		}
		if err != nil {
    
    
			fmt.Println("conn.Read err:", err)
			return
		}
		fmt.Println("客户端读到服务器回发:", string(buf[:n]))
	}
}

猜你喜欢

转载自blog.csdn.net/qq_51685718/article/details/127721798
今日推荐