golang练手小项目系列(4)-网络聊天室

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

问题描述:

实现一个网络聊天室服务端。完成之后你将熟悉select、net库、time定时器的用法。

要点:

用户发来的消息广播给所有接入聊天室的用户。

新用户进入的时候能收到聊天室所有其他用户的名字列表。

使用netcat工具作为客户端。

拓展:

当用户不活跃的时间超过指定时间后,断开用户的连接。

代码:

import (

"bufio"

"fmt"

"log"

"net"

"time"

)

type client struct {

Out  chan<- string

Name string

}

var (

entering = make(chan client)

leaving = make(chan client)

messages = make(chan string)

)

var timeout = 10 * time.Second

func broadcaster()  {

clients := make(map[client] bool)

for {

select {

case msg := <-messages:

for cli := range clients {

cli.Out <- msg

}

case cli := <-entering:

clients[cli] = true

cli.Out <- "Present:"

for c := range clients {

cli.Out <- c.Name

}

case cli := <-leaving:

delete(clients, cli)

close(cli.Out)

}

}

}

func handleConn(conn net.Conn){

out := make(chan string, 10)

go clientWriter(conn, out)

in := make(chan string)

go clientReader(conn, in)

var who string

var nameTimer = time.NewTimer(timeout)

out <- "Enter your name:"

select {

case name := <-in:

who = name

case <-nameTimer.C:

conn.Close()

return

}

cli := client{out, who}

out <- "You are " + who

messages <- who + " has arrived"

entering <- cli

idle := time.NewTimer(timeout)

Loop:

for {

select {

case msg := <-in:

messages <- who + ": " + msg

idle.Reset(timeout)

case <-idle.C:

conn.Close()

break Loop

}

}

leaving <- cli

messages <- who + " has left"

conn.Close()

}

func clientWriter(conn net.Conn, ch <-chan string)  {

for msg := range ch{

fmt.Fprintln(conn, msg)

}

}

func clientReader(conn net.Conn, ch chan<- string) {

input := bufio.NewScanner(conn)

for input.Scan() {

ch <- input.Text()

}

}

func main() {

listener, err := net.Listen("tcp", "localhost:8088")

if err != nil{

log.Fatal(err)

}

go broadcaster()

for {

conn, err := listener.Accept()

if err != nil{

log.Print(err)

continue

}

go handleConn(conn)

}

}


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

计算机网络(第4版)

计算机网络(第4版)

[美] James F. Kurose、[美] Keith W. Ross / 陈鸣 / 机械工业出版社 / 2009-11 / 66.00元

本书采用了独创的自顶向下方法,即从应用层开始沿协议栈向下讲解计算机网络的基本原理,强调应用层范例和应用编程接口,内容深入浅出,注重教学方法,理论与实践相结合。第3版的内容相应更新并反映了网络领域的最新进展,如增加了无线和移动网络一章,扩充了对等网络、BGP、MPLS、网络安全、广播选路和因特网编址及转发方面的材料;还增加了一套实用的实验,并修订了习题。本书适合作为计算机、电子、通信工程相关专业的本......一起来看看 《计算机网络(第4版)》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具