Golang中socket套接字

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


server与client基础通信

1. 网络分层

Golang中socket套接字_golang

2.socket

Golang中socket套接字_服务器_02

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

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


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go