【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

这是一篇关于聊天室开发的博客,原来文章的地址来自于此。这篇文章非常具有代表性,对于代码中的函数部分内容,不想多说什么,只是对它的实现进行一些必要的讲解。关于代码,大家既可以在这里阅读,也可以跳转到那篇博客,继续阅读。

package mainimport("fmt""os""net"
)//
//错误检查
//func checkError(err error,info string) (res bool) {if(err != nil){fmt.Println(info+"  " + err.Error())return false}return true
}//
//服务器端接收数据线程
//参数:
//      数据连接 conn
//      通讯通道 messages
//func Handler(conn net.Conn,messages chan string){fmt.Println("connection is connected from ...",conn.RemoteAddr().String())buf := make([]byte,1024)for{lenght, err := conn.Read(buf)if(checkError(err,"Connection")==false){conn.Close()break}if lenght > 0{buf[lenght]=0}//fmt.Println("Rec[",conn.RemoteAddr().String(),"] Say :" ,string(buf[0:lenght]))reciveStr :=string(buf[0:lenght])messages <- reciveStr}}//
//服务器发送数据的线程
//
//参数
//      连接字典 conns
//      数据通道 messages
//func echoHandler(conns *map[string]net.Conn,messages chan string){for{msg:= <- messagesfmt.Println(msg)for key,value := range *conns {fmt.Println("connection is connected from ...",key)_,err :=value.Write([]byte(msg))if(err != nil){fmt.Println(err.Error())delete(*conns,key)}}}}//
//启动服务器
//参数
//  端口 port
//func StartServer(port string){service:=":"+port //strconv.Itoa(port);tcpAddr, err := net.ResolveTCPAddr("tcp4", service)checkError(err,"ResolveTCPAddr")l,err := net.ListenTCP("tcp",tcpAddr)checkError(err,"ListenTCP")conns:=make(map[string]net.Conn)messages := make(chan string,10)//启动服务器广播线程go echoHandler(&conns,messages)for  {fmt.Println("Listening ...")conn,err := l.Accept()checkError(err,"Accept")fmt.Println("Accepting ...")conns[conn.RemoteAddr().String()]=conn//启动一个新线程go Handler(conn,messages) }}//
//客户端发送线程
//参数
//      发送连接 conn
//func chatSend(conn net.Conn){var input stringusername := conn.LocalAddr().String()for {fmt.Scanln(&input)if input == "/quit"{fmt.Println("ByeBye..")conn.Close()os.Exit(0);}lens,err :=conn.Write([]byte(username + " Say :::" + input))fmt.Println(lens)if(err != nil){fmt.Println(err.Error())conn.Close()break}}}//
//客户端启动函数
//参数
//      远程ip地址和端口 tcpaddr
//func StartClient(tcpaddr string){tcpAddr, err := net.ResolveTCPAddr("tcp4", tcpaddr)checkError(err,"ResolveTCPAddr")conn, err := net.DialTCP("tcp", nil, tcpAddr)checkError(err,"DialTCP")//启动客户端发送线程go chatSend(conn)  //开始客户端轮训buf := make([]byte,1024)for{lenght, err := conn.Read(buf)if(checkError(err,"Connection")==false){conn.Close()fmt.Println("Server is dead ...ByeBye")os.Exit(0)}fmt.Println(string(buf[0:lenght]))}
}//
//主程序
//
//参数说明:
//  启动服务器端:  Chat server [port]              eg: Chat server 9090
//  启动客户端:    Chat client [Server Ip Addr]:[Server Port]     eg: Chat client 192.168.0.74:9090
//func main(){if len(os.Args)!=3  {    fmt.Println("Wrong pare")os.Exit(0)}if os.Args[1]=="server" && len(os.Args)==3 {StartServer(os.Args[2])}if os.Args[1]=="client" && len(os.Args)==3 {StartClient(os.Args[2])}}

主要知识点如下:

(1)代码中包括了服务器和客户端的内容,如果是服务器,直接输入./chat server 9090即可,客户端也很简单,输入./chat client :9090就好;

(2)如果是客户端,其实就包括了两部分内容,一部分是chatSend函数,接受用户的输入;另一部分是connect到server,接受相关信息;

(3)如果是server,稍微复杂一点,有三个部分组成。第一部分就是不停地accept各个客户端;第二个就是为每一个客户端创立Handler函数,接受客户端发来的信息;第三个就是echoHandler函数,它的作用就是将从某一用户接受过来的信息广播给其他所有的客户端,就是这么简单。

神奇的go语言(聊天室的开发)相关推荐

  1. Linux环境下——C语言聊天室项目

    由于使用了多线程操作,客户端进入程序后请先随便注册一次用户后再进行使用. 本程序默认第一个用户即ID为1的用户为超级管理员. 由于线程阻塞,最后的踢人操作有阻塞,需要在被踢出在线链表后手动下线. 看了 ...

  2. 仿微信的网络聊天室项目开发【完整源码讲解】

    目录 总体开发思路 服务器端 服务器界面设计 建立TCP服务器端通信 建立服务器消息发送输出流 建立服务器消息接收输入流 建立服务器实时消息通信线程 设置服务器通信自由断开 客户端 客户端界面设计 建 ...

  3. FluorineFx + Flex视频聊天室案例开发----客户端

    上一篇<FluorineFx + Flex视频聊天室案例开发----服务器端>详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个 ...

  4. Flex与.NET互操作(十六):FluorineFx + Flex视频聊天室案例开发

    本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希望本篇可以帮助到需要使用FluorineFx做及时 ...

  5. 多人私密视频直播会议聊天室系统开发

    多人视频直播会议聊天室系统开发 轻便小巧无须安装 绑定公号无须登录 界面简洁操作方便 权限管理避免白嫖 前端/ 会议设置 用户可以设置姓名 管理员可以修改会议主题和分享说明文字 多人视频 左上显示用户 ...

  6. 【python】基于Socket的聊天室Python开发

    基于Socket的聊天室Python开发 一.Socket简述 二.创建服务端Server 2.1 创建服务端初始化 2.2 监听客户端连接 2.3 处理客户端消息 三.创建客户端Client 3.1 ...

  7. FMS视频聊天室的开发

    FMS视频聊天室的开发 2009年06月07日 由于FLASH技术的发展, FLASH对本地P2P的支持,越来越进这就出现了FMS FLASH视频聊天室的开发. flash聊天室,fms聊天室源码 一 ...

  8. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  9. 网络视频聊天室的开发指南

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

最新文章

  1. NIPS改名为NeurIPS的原因
  2. 艾伟_转载:.NET 4.0中数组的新增功能
  3. 二线城市IT人员如何发展
  4. python 把数据 json格式输出
  5. [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable
  6. 公司项目拓扑的演变过程
  7. unity android 版本,Unity2019与Android混合开发
  8. JavaWeb笔记(一)Java网络编程
  9. android 信鸽 小米推送,小米推送通道集成指南
  10. python下载电影包_我是如何使用python控制迅雷自动下载电影的?
  11. html简单图片轮播的实现
  12. 前端实现pdf文件的在线预览与下载
  13. 团队项目开发——细思恐极
  14. 联想台式计算机重装系统教程,联想台式机重装系统win7图文教程
  15. 汉语是思维广阔敏捷的语言
  16. java websocket即时通讯+layui实现移动端一对一聊天客服功能
  17. hive中出现rg.apache.hadoop.hive.ql.exec.mr.MapRedTask错误
  18. 易优CMS:uichannel的基础用法
  19. java号段_Java匹配国内手机号码段
  20. 95后工程师上班哼小曲?那些愉快上班的打工人,到底怎么做到的?

热门文章

  1. linux用grep查找文件内容
  2. 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题 (转)...
  3. 链栈,用链表写成的栈,源代码如下
  4. Flash与数学:圆(2)
  5. Fedora进入超级用户的方法
  6. 开始把一些东西放到博客上
  7. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
  8. AMIO编辑器开发(四):五一劳动节的编程较量,C++语言的设计模式
  9. 巧用SQL的全局临时表防止用户重复登录
  10. 人生总是让人不知所错