美文网首页
Go语言学习笔记-聊天系统服务器与客户端

Go语言学习笔记-聊天系统服务器与客户端

作者: 努力的夏目_1bbc | 来源:发表于2018-12-15 18:00 被阅读0次
服务器

服务器就是有一个持续获取连接的动作,for循环实现,for循环开启处理消息的协程,处理消息的函数,接收消息并将消息写入缓冲信道。还有一个广播函数,用来将收到的消息发给所有与服务器连接的地址。

package main

import (
    "net"
    "os"
)

func main() {
    port := ":8080" //端口
    Start(port)

}
func Start(p string) {
    tcpAddr, err := net.ResolveTCPAddr("tcp", p)
    if err != nil {
        os.Exit(0)
        return
    }
    listener,err:= net.ListenTCP("tcp",tcpAddr)  //布置监听
    if err != nil {
        os.Exit(0)
        return
    }
    conns := make(map[string]net.Conn) //连接池,用来保存所有人的数据
    message := make(chan string,10)    //缓冲消息信道
    //时刻监听
    for{
      conn,err:= listener.AcceptTCP()  //返回网络连接
      if err!=nil{
          os.Exit(0)
          fmt.Println("Acception failed!")
          continue
      }
      conns[conn.RemoteAddr().String()] = conn  //将新连接存进map,键是他的远程地址
      go HandlerMessage(conn,message)  //启动接收信息协程
    }

}

//广播到所有conn  除了发出消息的
func BroadCast(conns map[string]net.Conn,mess chan int) {
    for {
        mess := <-messages  //读取信道信息
        for k, v := range conns {
            _, err := v.Write([]byte(mess))
            if err != nil {
                delete(conns, k)
                v.Close()
                continue
            }
            v.Write([]byte("BroadCast"))
        }
    }
}

//处理收的的消息
func HandlerMessage(conn net.Conn,mess chan string) {
    //for循环持续接收conn连接发来的信息
    for{
        buf := make([]byte,1024)
        length,err:=conn.Read(&buf)  //读取消息
        if err != nil {
            conn.Close()
            delete(cns, conn.RemoteAddr().String())
            break
        }
        mess<-string(buf[0:length])  //接收到的信息写入信道
        fmt.Println(string(buf[0:length]))
    }
  
}

客户端

客户端有一个开始的函数,用来连接服务器,开启协程,读取服务器发来的消息。发送消息的函数,接收输入消息后用conn.Write()发送消息。

package main

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

func main() {
    Start(os.Args[1])  //os.Args是存储命令行的

}
func Start(addr string) {
    Tcpaddr, err := net.ResolveTCPAddr("tcp4", addr) //获取tcp
    if err != nil {
        log.Printf("Address error: %v\n", err)
        return
    }
    conn, err := net.DialTCP("tcp", nil, Tcpaddr) //连接服务器
    if err != nil {
        log.Printf("Dial to Server failed! %v\n", err)
        return
    }
    //启动发送消息协程
    go SendMessage(conn)
    buf := make([]byte, 1024)
    for {
        length, err := conn.Read(buf) //读取服务器发来的消息
        if err != nil {
            log.Printf("receive server's message failed! %v\n", err)
            conn.Close()   //关闭
            os.Exit(0)
        }
        fmt.Println(string(buf[0:length]))

    }
}
func SendMessage(conn net.Conn) {
    username := conn.LocalAddr().String()
    for {
        var in string
        fmt.Scanln(&in)   //接收输入的消息到in变量
        if len(in) > 0 {
            msg := username + "say:" + in
            _, err := conn.Write([]byte(msg))  //发送消息
            if err != nil {
                conn.Close()
                break
            }
        }
    }
}

相关文章

  • Go语言学习笔记-聊天系统服务器与客户端

    服务器 服务器就是有一个持续获取连接的动作,for循环实现,for循环开启处理消息的协程,处理消息的函数,接收消息...

  • 19年第35周:Go语言 搭建聊天服务器

    一、聊天服务器结构图 二、效果演示 聊天服务器.gif 三、程序代码 服务端.go 客户端.go 欢迎交流!

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

  • GO语言初级学习之代码案例12 (UDP通信)

    @(go语言 黑马)[GO语言] UDP通信 题目:编写UDP通信的并发服务器和客户端 知识点:UDP通信 逻辑思...

  • 笨办法学golang(二)

    这是Go语言学习笔记的第二篇文章。 Go语言学习笔记参考书籍「Go语言编程」、Go官方标准库 前文提要 上篇文章中...

  • 笨办法学golang(四)

    这是Go语言学习笔记的第四篇 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 数组 数组是指一系列同类...

  • go http学习笔记

    go http学习笔记 @[goweb, go, http] 1.go http基础 go http服务器简例 h...

  • 基于TCP SOCKET实现的远程聊天系统

    一、实验目的 本次实验需要完成一个实时聊天系统。该系统由聊天客户端和聊天服务器组成。客户端即可以给指定客户端发送信...

  • 基于TCP SOCKET实现的远程聊天系统

    一、实验目的 本次实验需要完成一个实时聊天系统。该系统由聊天客户端和聊天服务器组成。客户端即可以给指定客户端发送信...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

网友评论

      本文标题:Go语言学习笔记-聊天系统服务器与客户端

      本文链接:https://www.haomeiwen.com/subject/wpiahqtx.html