利用GO语言实现多人聊天室实例教程

前言

运用go里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室,用一个服务器来管理,主要反馈客户端是否连接成功并显示客户端输入的内容,并且发送给每一个在服务器上连接的客服端,下面话不多说了,来一起看看详细的介绍吧。

示例代码

服务器代码

// server
package main
import (
 "fmt"
 "net"
) 

var ConnMap map[string]*net.TCPConn
func checkErr(err error) int {
 if err != nil {
 if err.Error() == "EOF" {
  fmt.Println("用户退出")
  return 0
 }
 fmt.Println("发生错误")
 return -1
 }
 return 1
}
func say(tcpConn *net.TCPConn) {
 for {
 data := make([]byte, 256)
 total, err := tcpConn.Read(data)
 if err != nil {
  fmt.Println(string(data[:total]), err)
 } else {
  fmt.Println(string(data[:total]))
 }
 flag := checkErr(err)
 if flag == 0 {
  break
 }
 for _, conn := range ConnMap {
  if conn.RemoteAddr().String() == tcpConn.RemoteAddr().String() {
  continue
  }
  conn.Write(data[:total])
 }
 }
}
func main() {
 //var conn net.TCPConn
 //localAddr :=conn.LocalAddr().String()
 //fmt.Println(localAddr)
 //tcpAddr, _ := net.ResolveTCPAddr("tcp",localAddr)
 tcpAddr, _ := net.ResolveTCPAddr("tcp", "192.168.128.216:8080")
 tcpListen, _ := net.ListenTCP("tcp", tcpAddr)
 ConnMap = make(map[string]*net.TCPConn)
 for {
 tcpConn, _ := tcpListen.AcceptTCP()
 defer tcpConn.Close()
 ConnMap[tcpConn.RemoteAddr().String()] = tcpConn
 fmt.Println("连接客户端信息:", tcpConn.RemoteAddr().String())
 go say(tcpConn)
 }
} 

本来打算用系统的LocalAddr()函数来直接调用本地网络地址,但是这里调用一直报格式的错误,所以这里用本地地址直接输在里面,端口是8080//192.168.247.128:8080,也可以改成和客户端相似的代码来进行调用,但鉴于服务器唯一,所以就不做更改了

客户端代码

// client
package main
import (
 "fmt"
 "net"
 "os"
) 

var ch chan int = make(chan int)
var nickname string
func reader(conn *net.TCPConn) {
 buff := make([]byte, 256)
 for {
 j, err := conn.Read(buff)
 if err != nil {
  ch <- 1
  break
 }
 fmt.Printf("%s\n", buff[0:j])
 }
}
func main() {
 if len(os.Args) != 2 {
 fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0])
 os.Exit(1)
 }
 service := os.Args[1]
 TcpAdd, _ := net.ResolveTCPAddr("tcp", service)
 //TcpAdd, _ := net.ResolveTCPAddr("tcp", "localhost:8080")
 conn, err := net.DialTCP("tcp", nil, TcpAdd)
 if err != nil {
 fmt.Println("服务没打开")
 os.Exit(1)
 }
 defer conn.Close()
 go reader(conn)
 fmt.Println("请输入昵称")
 fmt.Scanln(&nickname)
 fmt.Println("你的昵称是:", nickname)
 //var str string
 for {
 var msg string
 fmt.Scan(&msg)
 fmt.Print("<" + nickname + ">" + "说:")
 //for i, _ := range msg {
 // fmt.Printf("%c", msg[i])
 //}
 fmt.Println(msg)
 b := []byte("<" + nickname + ">" + "说:" + msg)
 conn.Write(b)
 select {
 case <-ch:
  fmt.Println("server发生错误,请重新连接")
  os.Exit(2)
 default:
 }
 }
} 

客户端主要就是向服务器发起连接,然后发送和接收数据,原计划定义一个字符切片来存储读来的数据,但是出现了调用fmt.Println()来输出是时候显示ASCII码的错误,所以改成直接往一个空字符串里面读写,然后再来调用fmt.Println() ,显示出正确的字符串

运行服务器

go build server.go

./server

或  go run server.go

运行客户端

go build client.go

./client 服务器地址:端口(上面例子是192.168.247.128:8080)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • golang基于websocket实现的简易聊天室程序
(0)

相关推荐

  • golang基于websocket实现的简易聊天室程序

    本文实例讲述了golang基于websocket实现的简易聊天室.分享给大家供大家参考,具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/websocket 文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket 首先安装websocket包 复制代码 代码

  • 利用GO语言实现多人聊天室实例教程

    前言 运用go里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室,用一个服务器来管理,主要反馈客户端是否连接成功并显示客户端输入的内容,并且发送给每一个在服务器上连接的客服端,下面话不多说了,来一起看看详细的介绍吧. 示例代码 服务器代码 // server package main import ( "fmt" "net" ) var ConnMap map[string]*net.TCPConn func checkErr(err error) in

  • 基于Nodejs利用socket.io实现多人聊天室

    socket.io简介 在Html5中存在着这样的一个新特性,引入了websocket,关于websocket的内部实现原理可以看这篇文章,这篇文章讲述了websocket无到有,根据协议,分析数据帧的头,进行构建websocket.虽然代码短,但可以很好地体现websocket的原理. ,这个特性提供了浏览器端和服务器端的基于TCP连接的双向通道.但是并不是所有的浏览器都支持websocket特性,故为了磨平浏览器间的差异,为开发者提供统一的接口,引入了socket.io模块.在不支持webs

  • 利用Python打造一个多人聊天室的示例详解

    一.实验名称 建立聊天工具 二.实验目的 掌握Socket编程中流套接字的技术,实现多台电脑之间的聊天. 三.实验内容和要求 vii.掌握利用Socket进行编程的技术 viii.必须掌握多线程技术,保证双方可以同时发送 ix.建立聊天工具 x.可以和多个人同时进行聊天 xi.必须使用图形界面,显示双方的语录 四.实验环境 PC多台,操作系统Win7,win10(32位.64位) 具备软件python3.6 . 五.操作方法与实验步骤 服务端 1.调入多线程.与scoket包,用于实现多线程连接

  • Java NIO Selector用法详解【含多人聊天室实例】

    本文实例讲述了Java NIO Selector用法.分享给大家供大家参考,具体如下: 一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 NIO是面向通道和缓冲区的,意思就是:数据总是从通道中读到buffer缓冲区内,或者从buffer写入到通道中. 关于Channel 和 Buffer的详细讲解请看:Java NIO 教程 二.Java NIO Se

  • 利用C语言的Cairo图形库绘制太极图实例教程

    前言 可能许多人对直接用C语言绘图仍然停留在Turbo C的graphics.h年代,或许也有教育老化的原因,毕竟曾经的经典早已成往事,与其想尽各种办法寻找与其兼容的图形库,不如顺势拥抱灿烂的明天.Cario(http://cairographics.org/)是一个非常出色的2D图形库,著名的GTK+3.0完全采用Cario作为绘图引擎,由此可见它的强大和吸引力. Cario支持X Window,Quartz,Win32,image.buffers,PostScript,PDF和SVG文件等多

  • Go语言多人聊天室项目实战

    本文为大家分享了Go语言多人聊天室项目实战,供大家参考,具体内容如下 功能需求 实现单撩 实现群撩 实现用户上线的全网通知 实现用户昵称 实现聊天日志的存储和查看 服务端实现 type Client struct { conn net.Conn name string addr string } var ( //客户端信息,用昵称为键 //clientsMap = make(map[string]net.Conn) clientsMap = make(map[string]Client) ) f

  • 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室

    一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

  • nodejs+express搭建多人聊天室步骤

    前言 本文主要是笔者在学习node的时候,作为练手的一个小项目,花了几天空余时间,边码边写教程的一个过程.适用于对node理论知识看的多,实战少的同学,那么现在就让我们开始吧! 准备工作 新建一个文件夹 chatroom 在终端输入以下命令,按照步骤npm(没装过的去官网安装下node和npm)会自动给你生成一个package.json文件 安装express和socket.io package.json文件如下: //package.json { "name": "chat

  • Java基于中介者模式实现多人聊天室功能示例

    本文实例讲述了Java基于中介者模式实现多人聊天室功能.分享给大家供大家参考,具体如下: 一 模式定义 中介者模式,用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显示地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系. 二 模式举例 1 模式分析 我们借用多人聊天室来说明这一模式 2 中介模式静态类图 3 代码示例 3.1中介者接口--IMediator package com.demo.mediator; import com.demo.coll

  • java编程实现多人聊天室功能

    本文实例为大家分享了java实现多人聊天室的具体代码,供大家参考,具体内容如下 程序源代码及运行截图: server.java //server.java package Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; impor

随机推荐