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套接字的主要内容,如果未能解决你的问题,请参考以下文章