golang实现qq聊天之客户端与服务器

栏目: Go · 发布时间: 5年前

内容简介:一、用到的net方法1 、客户端:2、服务器

一、用到的net方法

1 、客户端:

var buf [512]byte
    tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:9090")
    //向服务器拨号
    conn, _ := net.DialTCP("tcp", nil, tcpAddr)
    //获取远程服务器地址
    rAddr := conn.RemoteAddr()
    //发送数据
    n, _ := conn.Write([]byte(""))
    //接收数据
    n, _ = conn.Read(buf[0:])

2、服务器

func ResolveTCPAddr(network, address string) (*TCPAddr, error)
ResolveTCPAddr返回TCP端点的地址。
网络必须是TCP网络名。
如果地址参数中的主机不是字面IP地址或者端口不是字面端口号,那么ResolveTCPAddr将地址解析为TCP端点的地址。
否则,它将地址解析为一对文字IP地址和端口号。
address参数可以使用主机名,但不建议这样做,因为它将最多返回一个主机名的IP地址。
有关网络和地址的描述,请参阅func Dial参数。

network : Tcp Tcp4 Tcp6         address : :9090  应该是访问地址
返回值:*TCPAddr 地址   第二个返回值:err 
 
监听:func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)
ListenTCP在本地TCP地址laddr上声明并返回一个*TCPListener,net参数必须是"tcp"、"tcp4"、"tcp6",如果laddr的端口字段为0,函数将选择一个当前可用的端口,可以用Listener的Addr方法获得该端口

第一个参数:TCP   第二个参数 *TCPAddr 地址   返回值 :

具体代码实现

net.go

package main

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

func main() {
tcpAddr, _ := net.ResolveTCPAddr("tcp", ":9090")
    //向服务器拨号
    conn, _ := net.DialTCP("tcp", nil, tcpAddr)
    go HandlerMessage(conn)
    //接受来自服务器的消息
    buf := make([]byte, 1024)
    for {
        length, err := conn.Read(buf)
        fmt.Println(length)
        if err != nil {
            log.Printf("recv server msg failed :%v\n", err)
            conn.Close()
            os.Exit(0)
            break
        }
        fmt.Println(string(buf[0:length]))
    }

}
func HandlerMessage(conn net.Conn) {
    //获取用户的地址
    username := conn.LocalAddr().String()
    for {
        var input string
        //获取用户发送的消息
        fmt.Scanln(&input)
        if len(input) > 0 {
            msg := username + " say " + input
            //
            _, err := conn.Write([]byte(msg))
            if err != nil {
                conn.Close()
                break
            }
        }
    }
}

server.go

package main

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

func main() {
    port := "9090"
    StartServer(port)
}
func StartServer(p string) {
    port := ":" + p
    //返回tcp地址
    tcpAddr, err := net.ResolveTCPAddr("tcp", port)
    fmt.Println(tcpAddr)
    if err != nil {
        os.Exit(0)
        return
    }
    //监听tcp地址
    listener, err := net.ListenTCP("tcp", tcpAddr)
    if err != nil {
        os.Exit(0)
        return
    }
    buf := make([]byte, 1024)
    conns := make(map[string]net.Conn)  //用户池
    messages := make(chan string, 10)  //消息的通道
    go BroadCastMessage(conns, messages)  //
    //每有一个客户进来就将其放入用户池
    for {
        conn, err := listener.AcceptTCP()
        if err != nil {
            fmt.Println("Accept failed")
            continue
        }
        conns[conn.RemoteAddr().String()] = conn  //将新进来的用户放进用户池
        go HandlerMessage(conn, buf, conns, messages)  //开一个协程监听用户是否发送消息
    }

}
//将收到的信息发送到每一个客户端
func BroadCastMessage(cns map[string]net.Conn, messages chan string) {
    for {
        messtr := <-messages    //接受通道里的消息
        //将接收到的消息发送给用户池里的每一个用户
        for k, v := range cns {
            _, err := v.Write([]byte(messtr))  //发送消息
            if err != nil {
                delete(cns, k)  //如果出现错误 删除用户 结束本次循环
                v.Close()
                continue
            }
        }
    }
}
//接受用户发送的消息
func HandlerMessage(conn net.Conn, buf []byte, cns map[string]net.Conn, messages chan string) {
    for {
        length, err := conn.Read(buf)
        if err != nil {
            conn.Close()
            delete(cns, conn.RemoteAddr().String())
            break
        }
        messages <- string(buf[0:length])  //将用户的信息放到通道里
        // fmt.Println(string(buf[0:length]))
    }
}

OK!


以上所述就是小编给大家介绍的《golang实现qq聊天之客户端与服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻松学算法

轻松学算法

赵烨 / 电子工业出版社 / 2016-7 / 69.00元

《轻松学算法——互联网算法面试宝典》共分为12 个章节,首先介绍了一些基础的数据结构,以及常用的排序算法和查找算法;其次介绍了两个稍微复杂一些的数据结构——树和图,还介绍了每种数据结构和算法的适用场景,之后是一些在工作与面试中的实际应用,以字符串、数组、查找等为例介绍了一些常见的互联网面试题及分析思路,便于读者了解这些思路,顺利地通过互联网公司的面试;最后介绍了一些常见的算法思想,便于读者对今后遇......一起来看看 《轻松学算法》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器