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() }
感谢大家观看,我们下次见