网络编程之实现多客户端 连接服务器 并且发送消息代码实现


项目结构如下图:

server.go中的代码如下:

package main

import (
    "fmt"
    "net" //做网络socket开发时,net包含有我们需要所有的方法和函数
    _"io"
)

func process(conn net.Conn) {

    defer conn.Close() //关闭conn

    //这里我们循环的接收客户端发送的数据
    for {

        buf := make([]byte, 1024)//创建一个新的切片
        //conn.Read(buf)
        //1. 等待客户端通过conn发送信息
        //2. 如果客户端没有wrtie[发送],那么协程就阻塞在这里
        //fmt.Printf("服务器在等待客户端%s 发送信息\n", conn.RemoteAddr().String())
        n , err := conn.Read(buf) //从conn读取
        if err != nil {
            fmt.Printf("客户端退出 err=%v", err)
            return
        }
        //3. 显示客户端发送的内容到服务器的终端
        fmt.Print(string(buf[:n])) 
    }
}

func main() {

    fmt.Println("服务器开始监听....")
    //net.Listen("tcp", "0.0.0.0:8888")
    //1. tcp 表示使用网络协议是tcp
    //2. 0.0.0.0:8888 表示在本地监听 8888端口
    listen, err := net.Listen("tcp", "0.0.0.0:8888")
    if err != nil {
        fmt.Println("listen err=", err)
        return 
    }
    defer listen.Close() //延时关闭listen

    //循环等待客户端来链接我
    for {
        fmt.Println("等待客户端来链接....")
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("Accept() err=", err)

        } else {
            fmt.Printf("Accept() suc con=%v 客户端ip=%v\n", conn, conn.RemoteAddr().String())
        }
        //这里准备其一个协程,为客户端服务
        go process(conn)
    }

    //fmt.Printf("listen suc=%v\n", listen)
}

client.go中的代码如下:

package main

import (
    "fmt"
    "net"
    "bufio"
    "os"
    "strings"
)

func main() {

    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Println("client dial err=", err)
        return 
    }
    //功能一:客户端可以发送单行数据,然后就退出
    reader := bufio.NewReader(os.Stdin) //os.Stdin 代表标准输入[终端]

    for {
        //从终端读取一行用户输入,并准备发送给服务器
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("readString err=", err)
        }
        //如果用户输入的是 exit就退出
        line = strings.Trim(line, " \r\n")
        if line == "exit" {
            fmt.Println("客户端退出..")
            break
        }

        //再将line 发送给 服务器
        _, err = conn.Write([]byte(line + "\n"))
        if err != nil {
            fmt.Println("conn.Write err=", err) 
        }
    }
}

测试:启动一个服务器,两个客户端,通讯成功。

网络编程之实现多客户端 连接服务器 并且发送消息代码实现 介绍到这里,更多Go学习请参考编程字典Go教程 和问答部分,谢谢大家对编程字典的支持。


原文链接:https://blog.csdn.net/cui_yonghua/article/details/95213747?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163523372016780265481777%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163523372016780265481777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-16-95213747.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450