Golang中socket套接字

server与client基础通信

1. 网络分层

Golang中socket套接字_第1张图片

2.socket

Golang中socket套接字_第2张图片

socket-server DEMO

只能接收一次连接,只能发送一次数据

package main 

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

func main(){
	// 创建监听
	ip := "127.0.0.1"
	port := 8800
	address := fmt.Sprintf("%s:%d",ip,port)

	// func Listen(network,address string) (Listener,error){
	// net.Listen("tcp","8800") // 简写,冒号前面是本机 127.0.0.1
	listener,err := net.Listen("tcp",address)

	if err != nil{
		fmt.Println("net.Listen err:",err)
		return 
	}
	fmt.Println("监听中...")

	// Accept() (Conn,error)
	conn,err := listener.Accept()
	if err != nil{
		fmt.Println("listener.Accept err:",err)
		return
	}

	fmt.Println("连接建立成功!")

	// 创建一个容器,用于接收读取到的数据
	buf := make([]byte,1024) // 使用make来创建字节切片,type ==>uint8

	// Read(b []byte) (n int,err error)
	// cnt:真正读取client发来的数据的长度
	cnt,err := conn.Read(buf)

	if err != nil{
		fmt.Println("conn.Read err:",err)
		return
	}

	fmt.Println("Client =======> Server,长度",cnt,",数据:",string(buf[0:cnt]))

	// 服务器对客户端请求进行相应,将数据转换成大写 “hello" ==> HELLO
	// func ToUpper(s string) string {
	upperData := strings.ToUpper(string(buf[0:cnt]))

	// Write(b []byte) (n int,err error)
	cnt,err = conn.Write([]byte(upperData))
	fmt.Println("Client <======== Server,长度:",cnt,",数据:",upperData)

	// 关闭连接
	conn.Close()


}

client DEMO

package main 

import (
	"fmt"
	"net"
)

func main(){
	conn,err := net.Dial("tcp",":8800")
	if err != nil{
		fmt.Println("net.Dial err: ",err)
		return
	}

	fmt.Println("cliet与server连接建立成功!")
	sendData := []byte("helloworld")
	// 向服务器发送数据
	cnt,err := conn.Write(sendData)

	if err != nil {
		fmt.Println("conn.Write err:",err)
		return
	}

	fmt.Println("Client ===> Server cnt:",cnt,",data:",string(sendData))

	// 接收服务器返回的数据
	// 创建buf,用于接收服务器返回的数据
	buf := make([]byte,1024)
	cnt,err = conn.Read(buf)
	if err != nil{
		fmt.Println("conn.Read err:",err)
		return
	}

	fmt.Println("Client <==== Server,cnt:",cnt,",data:",string(buf[0:cnt]))

	conn.Close()
}

处理多次连接

package main 

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

func main(){
	// 创建监听
	ip := "127.0.0.1"
	port := 8800
	address := fmt.Sprintf("%s:%d",ip,port)

	// func Listen(network,address string) (Listener,error){
	// net.Listen("tcp","8800") // 简写,冒号前面是本机 127.0.0.1
	listener,err := net.Listen("tcp",address)

	if err != nil{
		fmt.Println("net.Listen err:",err)
		return 
	}


	// 需求:server可以接收多个连接 ===> 主go程负责监听,子go程负责数据处理
	// 每个连接可以接收处理多伦数据请求



    for {
    	fmt.Println("监听中...")
		// Accept() (Conn,error)
		conn,err := listener.Accept()
		if err != nil{
			fmt.Println("listener.Accept err:",err)
			return
		}

		fmt.Println("连接建立成功!")

        go handleFunc(conn)
		
	}
	


}

// 处理具体业务的逻辑,需要将conn传递进来,每一新连接,conn是不同的
func handleFunc(conn net.Conn){
	for {
			// 创建一个容器,用于接收读取到的数据
			buf := make([]byte,1024) // 使用make来创建字节切片,type ==>uint8

			// Read(b []byte) (n int,err error)
			// cnt:真正读取client发来的数据的长度
			cnt,err := conn.Read(buf)

			if err != nil{
				fmt.Println("conn.Read err:",err)
				return
			}

			fmt.Println("Client =======> Server,长度",cnt,",数据:",string(buf[0:cnt]))

			// 服务器对客户端请求进行相应,将数据转换成大写 “hello" ==> HELLO
			// func ToUpper(s string) string {
			upperData := strings.ToUpper(string(buf[0:cnt]))

			// Write(b []byte) (n int,err error)
			cnt,err = conn.Write([]byte(upperData))
			fmt.Println("Client <======== Server,长度:",cnt,",数据:",upperData)
		}
		// 关闭连接
		_ = conn.Close()
}

发送多次请求

package main 

import (
	"fmt"
	"net"
	"time"
)

func main(){
	conn,err := net.Dial("tcp",":8800")
	if err != nil{
		fmt.Println("net.Dial err: ",err)
		return
	}

	fmt.Println("cliet与server连接建立成功!")
	sendData := []byte("helloworld")
	for {
		// 向服务器发送数据
		cnt,err := conn.Write(sendData)

		if err != nil {
			fmt.Println("conn.Write err:",err)
			return
		}

		fmt.Println("Client ===> Server cnt:",cnt,",data:",string(sendData))

		// 接收服务器返回的数据
		// 创建buf,用于接收服务器返回的数据
		buf := make([]byte,1024)
		cnt,err = conn.Read(buf)
		if err != nil{
			fmt.Println("conn.Read err:",err)
			return
		}

		fmt.Println("Client <==== Server,cnt:",cnt,",data:",string(buf[0:cnt]))
		time.Sleep(1 * time.Second)
	}
	conn.Close()
}

感谢大家观看,我们下次见

你可能感兴趣的:(GO,golang,网络,服务器)