Go语言实现服务端消息接收和发送

Fronde ·
更新时间:2024-09-20
· 1465 次阅读

本文实例为大家分享了Go实现服务端消息接收和发送的具体代码,供大家参考,具体内容如下

一. 服务端接收数据并返回数据

服务端代码

package main import (    "net"    "fmt" ) func main() {    //创建TCPAddress变量,指定协议tcp4,监听本机8899端口    addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")    //监听TCPAddress设定的地址    lis, _ := net.ListenTCP("tcp4", addr)    fmt.Println("服务器已启动")    //阻塞式等待客户端消息,返回连接对象,用于接收客户端消息或向客户端发送消息    conn, _ := lis.Accept()    //把数据读取到切片中    b := make([]byte, 256)    fmt.Println("read之前")    //客户端没有发送数据且客户端对象没有关闭,Read()将会阻塞,一旦接收到数据就不阻塞    count, _ := conn.Read(b)    fmt.Println("接收到的数据:", string(b[:count]))    /*    向客户端发送数据     */    conn.Write([]byte("这是服务器传递的数据"))    //关闭连接    conn.Close()    fmt.Println("服务器结束") }

客户端代码

package main import (    "net"    "fmt" ) func main() {    //服务器端ip和端口    addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")    //申请连接客户端    conn, _ := net.DialTCP("tcp4", nil, addr)    //向服务端发送数据    count, _ := conn.Write([]byte("客户端传递的数据"))    fmt.Println("客户端向服务端发送的数据量为:", count)    /*    接收服务器传递回来的数据     */    b := make([]byte, 256)    c, _ := conn.Read(b)    fmt.Println(string(b[:c]))    关闭连接    conn.Close()    fmt.Println("客户端结束") }

可以在服务端添加循环,不停接收客户端发送来的数据,服务端代码修改如下

package main import (    "net"    "fmt" ) func main() {    addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")    lis, _ := net.ListenTCP("tcp4", addr)    fmt.Println("服务器已启动")    /*    服务器端添加死循环,不停的接收客户端对象     */    for {       conn, _ := lis.Accept()       b := make([]byte, 256)       count, _ := conn.Read(b)       nc := string(b[:count])       fmt.Println("接收到的数据:", nc)       conn.Write([]byte("服务器:" + nc))       conn.Close()    }    fmt.Println("服务器结束") }

客户端代码修改如下

package main import (    "net"    "fmt"    "strconv" ) func main() {    //服务器端ip和端口    addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")    //通过循环,模拟发送五次客户端请求    for i := 1; i <= 5; i++ {       conn, _ := net.DialTCP("tcp4", nil, addr)       conn.Write([]byte("客户端数据" + strconv.Itoa(i)))       b := make([]byte, 256)       c, _ := conn.Read(b)       fmt.Println("第", i, "次服务器返回的数据:", string(b[:c]))       conn.Close()    }    fmt.Println("客户端结束") } 三.并发访问

上面代码的问题是服务器获取到客户端对象后,如果客户端什么也没有输入,其他客户端无法连接.可以通过结合goroutine完成并发访问
只需要修改server.go,在里面添加goroutine

package main import (    "net"    "fmt" ) func main() {    addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899")    lis, _ := net.ListenTCP("tcp4", addr)    fmt.Println("服务器已启动")    /*    服务器端添加死循环,不停的接收客户端对象     */    for {       conn, _ := lis.Accept()       go func() { //在此处添加创建go func()即可          b := make([]byte, 256)          count, _ := conn.Read(b)          nc := string(b[:count])          fmt.Println("接收到的数据:", nc)          conn.Write([]byte("服务器:" + nc))          conn.Close()       }()    }    fmt.Println("服务器结束") }



服务端 GO go语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号