您的位置:首页 > 科技 > 能源 > 使用Go语言的net库搭建客户端服务器通信模型

使用Go语言的net库搭建客户端服务器通信模型

2024/12/28 1:39:57 来源:https://blog.csdn.net/qq_53517370/article/details/140830500  浏览:    关键词:使用Go语言的net库搭建客户端服务器通信模型

文章目录

    • 1. net
      • 1.1 Conn的方法
      • 1.2 Client代码
      • 1.3 Server代码

1. net

中文文档网址:https://studygolang.com/pkgdoc

  1. 客户端通过 func Dial(network, address string) (Conn, error)连接到服务器
  2. 服务器通过 func Listen(net, laddr string) (Listener, error)开启服务器端口,利用func (l *Listener) Accept() (Conn, error)来获取客户端的连接
  3. 发送消息通过下面的Write()Read()方法

1.1 Conn的方法

type Conn interface {// Read从连接中读取数据// Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真Read(b []byte) (n int, err error)// Write从连接中写入数据// Write方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真Write(b []byte) (n int, err error)// Close方法关闭该连接// 并会导致任何阻塞中的Read或Write方法不再阻塞并返回错误Close() error// 返回本地网络地址LocalAddr() Addr// 返回远端网络地址RemoteAddr() Addr// 设定该连接的读写deadline,等价于同时调用SetReadDeadline和SetWriteDeadline// deadline是一个绝对时间,超过该时间后I/O操作就会直接因超时失败返回而不会阻塞// deadline对之后的所有I/O操作都起效,而不仅仅是下一次的读或写操作// 参数t为零值表示不设置期限SetDeadline(t time.Time) error// 设定该连接的读操作deadline,参数t为零值表示不设置期限SetReadDeadline(t time.Time) error// 设定该连接的写操作deadline,参数t为零值表示不设置期限// 即使写入超时,返回值n也可能>0,说明成功写入了部分数据SetWriteDeadline(t time.Time) error
}

1.2 Client代码

package mainimport ("bufio""fmt""net""os"
)func main() {fmt.Println("正在连接到服务器...")// 调用Dial函数去连接conn, err := net.Dial("tcp", "127.0.0.1:4567")if err != nil {fmt.Println("Error connecting:", err.Error())return}fmt.Println("连接服务器成功")// 通过客户端的终端发送单行数据reader := bufio.NewReader(os.Stdin)for {fmt.Print("请输入要发送的内容:")// 读取一行输入msg, _ := reader.ReadString('\n')if msg == "exit\r\n" {fmt.Println("退出连接")conn.Close()break}n, _ := conn.Write([]byte(msg))fmt.Println("Sent", n, "bytes to server")}}

1.3 Server代码

package mainimport ("fmt""net"
)func handleRequest(conn net.Conn) {defer conn.Close()for {// 创建一个切片用于缓存数据buf := make([]byte, 1024)// 从 conn中读取数据n, err := conn.Read(buf)if err != nil {fmt.Println("Error reading:", err.Error())return}// 打印接收到的数据fmt.Printf("Received data: %s\n", string(buf[:n]))}}func main() {fmt.Println("Connecting to client ...")//Listen启动监听listen, err := net.Listen("tcp", "127.0.0.1:4567")if err != nil {fmt.Println("Error listening:", err.Error())return}fmt.Println("Listening on 127.0.0.1:4567")defer listen.Close()// 监听之后 等待客户端连接for {conn, err := listen.Accept()if err != nil {fmt.Println("Error accepting: ", err.Error())}fmt.Printf("Client connected ..., con=%v, Client info = %v \n", conn, conn.RemoteAddr().String())// go 启动一个协程处理客户端连接go handleRequest(conn)}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com