tcp协议写的一个广播消息

luominggao123 · 2017-11-11 09:06:36 · 2561 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-11 09:06:36 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "log"
    "net"
    "os"
)

var buffServer = make([]byte, 1024)
var buffClient = make([]byte, 1024)
var clients = make(map[string]net.Conn)
var messages = make(chan string, 10)

func TcpServer(port string) {
    port = ":" + port
    tcpAddr, err := net.ResolveTCPAddr("tcp4", port)
    if err != nil {
        log.Printf("error: %s\n", err)
        return
    }
    l, err := net.ListenTCP("tcp", tcpAddr)
    defer l.Close()
    if err != nil {
        log.Printf("error: %s\n", err)
        return
    }
    log.Printf("开启了服务端:%s\n", "正在监听客户端的请求")
    go BoradCast(clients, messages)
    for {
        conn, err := l.Accept()
        if err != nil {
            log.Printf("error: %s\n", err)
        }
        clients[conn.RemoteAddr().String()] = conn
        go HandleServer(conn, messages)
    }
}
func HandleServer(conn net.Conn, messages chan string) {
    for {
        _, err := conn.Read(buffServer)
        if err != nil {
            log.Printf("error: %s\n", err)
            conn.Close()
            return
        }
        messages <- string(buffServer)
    }
}
func BoradCast(clients map[string]net.Conn, messages chan string) {

    for {
        msg := <-messages
        for index, client := range clients {
            _, err := client.Write([]byte(msg))
            if err != nil {
                log.Printf("error: %s\n", err)
                delete(clients, index)
            }

        }
    }

}
func TcpClient(serverAddr string) {
    tcpAddr, err := net.ResolveTCPAddr("tcp4", serverAddr)
    if err != nil {
        log.Printf("error: %s\n", err)
        return
    }
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    defer conn.Close()
    if err != nil {
        log.Printf("error: %s\n", err)
        return
    }
    log.Printf("客户端:%s开始连接\n", conn.LocalAddr().String())
    go ClientSend(conn)
    for {
        _, err := conn.Read(buffClient)
        if err != nil {
            log.Printf("error: %s\n", err)
            return
        }
        log.Printf("收到消息:%s\n", string(buffClient))
    }
}
func ClientSend(conn net.Conn) {

    var input string
    username := conn.LocalAddr().String()
    for {

        fmt.Scanln(&input)
        if input == "/quit" {
            log.Printf("Info: %s\n", "ByeBye")
            conn.Close()
            os.Exit(0)
        }
        _, err := conn.Write([]byte(username + ":" + input))
        if err != nil {
            log.Printf("error: %s\n", err)
            return
        }

    }

}
//开启TcpServer: go run main.go server 端口号(8080)
//开启TcpClient: go run main.go client 本地ip地址:端口号(8080)
func main() {
    if len(os.Args) != 3 {
        log.Println("command error")
        os.Exit(0)
    }
    if os.Args[1] == "server" {
        TcpServer(os.Args[2])
    }
    if os.Args[1] == "client" {
        TcpClient(os.Args[2])
    }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2561 次点击  ∙  1 赞  
加入收藏 微博
4 回复  |  直到 2017-11-16 05:11:12
nightdoge
nightdoge · #1 · 7年之前

:simple_smile:

admin87
admin87 · #2 · 7年之前

你好。我是新手。学习了。有一个地方不太理解。你用通道来接收信息。但如果客户端多个时 如何区分通道内信息的发送人是谁

meission
meission · #3 · 7年之前
admin87admin87 #2 回复

你好。我是新手。学习了。有一个地方不太理解。你用通道来接收信息。但如果客户端多个时 如何区分通道内信息的发送人是谁

你这个可以在消息上增加逻辑处理来表明是属于那个客户端的

admin87
admin87 · #4 · 7年之前
meissionmeission #3 回复

#2楼 @admin87 你这个可以在消息上增加逻辑处理来表明是属于那个客户端的

谢谢,在问一下,如何在这里发代码。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传