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

来自:网络
时间:2023-01-01
阅读:

本文实例为大家分享了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("服务器结束")
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

返回顶部
顶部