Golang中socket套接字

Posted 2019ab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang中socket套接字相关的知识,希望对你有一定的参考价值。

server与client基础通信

1. 网络分层

2.socket

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()

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

以上是关于Golang中socket套接字的主要内容,如果未能解决你的问题,请参考以下文章

Golang 中的安全关闭连接

golang中怎么处理socket长连接

在golang中使用socket.io

golang socket与Linux socket比较分析

golang中tcp socket粘包问题和处理

golang golang中的Unix over Unix域套接字