golang实现的私聊服务
2015-05-24 10:53
393 查看
一个简单的golang实现的私聊,由服务器端决定两两匹配
服务器端 chat_server.go
客户端chat_client.go:
服务器端 chat_server.go
package main import ( "fmt" "io" "log" "net" ) const listenAddr = "localhost:4000" func main() { l, err := net.Listen("tcp", listenAddr) if err != nil { log.Fatal(err) } for { c, err := l.Accept() if err != nil { log.Fatal(err) } //go io.Copy(c, c) go match(c) } } var partner = make(chan io.ReadWriteCloser) func match(c io.ReadWriteCloser) { fmt.Fprint(c, "Waiting for a partner...") select { case partner <- c: // now handled by the other goroutine case p := <-partner: chat(p, c) } } /* func chat(a, b io.ReadWriteCloser) { fmt.Fprintln(a, "Found one! Say hi.") fmt.Fprintln(b, "Found one! Say hi.") go io.Copy(a, b) io.Copy(b, a) } */ func chat(a, b io.ReadWriteCloser) { fmt.Fprintln(a, "Found one! Say hi.") fmt.Fprintln(b, "Found one! Say hi.") errc := make(chan error, 1) go cp(a, b, errc) go cp(b, a, errc) if err := <-errc; err != nil { log.Println(err) } a.Close() b.Close() } func cp(w io.Writer, r io.Reader, errc chan<- error) { _, err := io.Copy(w, r) errc <- err }
客户端chat_client.go:
package main import ( "fmt" "log" "net" ) func main() { l, err := net.Dial("tcp", "localhost:4000") if err != nil { log.Fatal(err) } go send(l) for { datas := make([]byte, 255) n, err := l.Read(datas) if err != nil { log.Fatal(err) } fmt.Println(string(datas[0:n])) } } func send(l net.Conn){ sms := make([]byte, 255) for{ //fmt.Print("请输入要发送的消息:") _, err := fmt.Scan(&sms) if err != nil { fmt.Println("数据输入异常:", err.Error()) } l.Write(sms) } }
相关文章推荐
- 【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。
- golang 简单的实现内 网 穿 透,用户访问本地服务。
- golang实现简易TCP服务以及TCP和UDP协议对比
- kubernetes集群中利用etcd和grpc实现golang服务间通信
- Golang实现web文件共享服务的示例代码
- golang实现基于redis和consul的可水平扩展的排行榜服务范例
- 一个golang 实现tcp服务例子
- golang 实现一个restful微服务
- golang实战--实现短地址服务
- Golang实现的Web服务扫描工具
- 在openwrt路由中加入n2n,并在ubuntu里加入n2n服务,实现开机联网互通互访
- python实现FTP服务器服务的方法
- golang实现AVL树
- (五)Java EE 5实现Web服务(Web Services)及多种客户端实例-移动客户端
- 一起动手实现Windows服务程序(监控网站是否能访问) .
- Kubernetes(k8s)如何使用kube-dns实现服务发现
- 用nodejs实现json和jsonp服务的方法
- 在Spring框架中用AOP实现WEB服务的方法
- 使用vsftpd 实现 redhat linux6.0 下的ftp服务匿名上传下载功能
- 定制微型linux实现启用虚拟终端基于帐号密码登录、提供ssh服务,提供Web服务(下)附有命令移植脚本 推荐