Go语言实践_实现点对点聊天室

一、目的

使用Go语言实现一个服务器端与客户端的聊天室。

软件:Goland,Go1.9

二、思路

1,首先启动服务器端,使用listen_socket函数监听IP地址上的客户端连接;

2,启动客户端,并向服务器端发送数据,发送结束后端口阻塞,等待服务器端的消息;

3,服务器端接收到由客户端发送来的消息;

4,服务器端向客户端发送数据,发送结束后;

5,客户端接收到由服务器端发送来的消息,发送结束后端口阻塞,等待客户端的消息;

6,重复步骤2-5;

7,如果服务器端接收到由客户端发送来的“close"消息后,服务器端关闭与客户端的连接,继续等待下一个客户端的连接;

8,客户端关闭,聊天结束。

三、Go代码实现

Sever端

// One-to-one ChatRoom Sever
package main

import (
    "fmt"
    "net"
)

//var ConnMap map[string]*net.TCPConn

func main() {
    listen_socket, err := net.Listen("tcp", "127.0.0.1:8000")  //打开监听接口
    if err != nil { //如果有错误
        fmt.Println("sever error")
    }

    defer listen_socket.Close()  //延迟服务器端关闭
    fmt.Println("sever is wating ....")

    for {
        conn, err := listen_socket.Accept()  //监听客户端的端口
        if err != nil {
            fmt.Println("conn fail ...")
        }
        fmt.Println("connect client successed")  //显示服务器端连接成功

        var msg string  //声明msg为字符串变量

        for {
            //开始接收客户端发过来的消息
            msg = ""  //字符串msg初始为空
            data := make([]byte, 255)  //创建并声明数据变量,为255位
            msg_read, err := conn.Read(data)  //接收由客户端发来的消息,字节赋值给msg_read,err为错误
            if msg_read == 0 || err != nil {  //如果读取的消息为0字节或者有错误
                fmt.Println("err")
            }

            msg_read_str := string(data[0:msg_read])  //将msg_read_str的字节格式转化成字符串形式
            if msg_read_str == "close" {  //如果接收到的客户端消息为close
                conn.Write([]byte("close"))
                break
            }
            //fmt.Println(string(data[0:msg_read]))
            fmt.Println("client say: ", msg_read_str)  //接收客户端发来的信息

            fmt.Printf("say to client: ")  //提示向客户端要说的话
            fmt.Scan(&msg)  //输入服务器端要对客户端说的话
            //conn.Write([]byte("hello client\n"))
            //msg_write := []byte(msg)
            conn.Write([]byte(msg))  //把消息发送给客户端
            //此处造成服务器端的端口堵塞
        }
        fmt.Println("client Close\n")
        conn.Close()  //关闭连接
    }

}

Client端

// One-to-one ChatRoom Client
package main

import (
    "fmt"
    "net"
)

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("conn fail...")
    }
    defer conn.Close()
    fmt.Println("connect sever successed")

    var msg string  //声明msg为字符串变量

    for {
        msg = ""  //初始化msg为空值
        fmt.Printf("say to sever: ")
        fmt.Scan(&msg)  //输入客户端向服务器端要发送的消息
        //fmt.Println(msg)
        //msg_write := []byte(msg)
        //conn.Write(msg_write)
        conn.Write([]byte(msg))  //信息转化成字节流形式并向服务器端发送
        //此处造成客户端程序端口堵塞
        //fmt.Println([]byte(msg))

        //等待服务器端发送信息回来
        data := make([]byte, 255)
        msg_read, err := conn.Read(data)
        if msg_read == 0 || err != nil {
            fmt.Println("err")
        }
        msg_read_str := string(data[0:msg_read])
        if msg_read_str == "close" {
            conn.Write([]byte("close"))
            break
        }

        fmt.Println("sever say:", msg_read_str)
    }
    conn.Close()
}

四、小结

  • Write、Read、conn、Scan函数可造成程序的堵塞;
  • 网络中一般是用字节进行数据的传输,所以需要进行格式转换:发送时由字符串转字节;接收时由字节转字符串。

原文地址:https://www.cnblogs.com/OctoptusLian/p/9401922.html

时间: 2024-10-21 05:44:51

Go语言实践_实现点对点聊天室的相关文章

php+websocket搭建简易聊天室实践

1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短连接和长连接.短连接一般可以用ajax实现,长连接就是websocket.短连接实现起来比较简单,但是太过于消耗资源.websocket高效不过兼容存在点问题.websocket是html5的资源 如果想要详细了解websocket长连接的原理请看https://www.zhihu.com/ques

netty-socket.io点对点通讯和聊天室通讯

netty-socketio是基于netty的socket.io服务实现,可以无缝对接前端使用的socketio-client.js. 相对于javaee的原生websocket支持(@serverEndpoint)和spring-boot的MessageBroker(@messageMapping),netty-socketio绝对是最好用的websocket后台实现.因为netty-socketio完整的实现了socket.io提供的监听前台事件.向指定客户端发送事件.将指定客户端加入指定房

go语言实现简单的聊天室

通常聊天室的架构分为服务器端和客户端: 服务器端:接受来自于客户端的连接请求并建立连接:所有客户端的连接会放进连接池中,用于广播消息: 客户端:连接服务器:向服务器发送消息:接收服务器的广播消息: 注意事项:某一个客户端断开连接后需要从连接池中摘除,并不再接收广播消息:某一个客户端断开连接后不能影响服务器端或别的客户端的连接: 详细的代码如下,文档看注释就好了,不再细说: 服务器: server.go package main import ( "net" "log"

go语言实现聊天室

go语言实现聊天室 聊天室分为服务端和客户端.第一部分为服务端代码,第二部分为客户端代码. 一.服务端代码 //chatroom server package main import ( "fmt" "net" ) //定义函数checkError,用来错误处理 func checkError(err error) { if err != nil { panic(err) } } //定义一个函数,专门负责接收信息的协程 func processInfo(conn

基于TCP/IP的局域网聊天室---C语言

具备注册,群聊,查看在线人员信息,私发文件和接收文件功能,因为每个客户端只有一个属于自己的socket,所以无论客户端是发聊天消息还是文件都是通过这一个socket发送, 这也意味着服务器收发任何消息或文件都只能有一个select函数也意味着只能有一个收发消息的线程. 所以我定义了一个通用结构体: struct snd{ char msg[30];    //消息性质,同时也是普通聊天消息.. int soc;        //套接字 int count;        //用户账号 char

2__1.8__模拟聊天室_使用textview_先读取再拼接

activity_chat.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

【Java】Socket+多线程实现控制台聊天室

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端程序传送信息到服务器,服务器再把信息分发到其他客户端上,实现即时通信. 所需技术: 1:数据传输. 服务器与客户端之间的信息传递,都通过数据通道实现,有一个客户端连接到服务器,就有一条数据通道架设于该客户端和服务器之间. 这条数据通道通过Socket来实现:每个客户端通过一个socket与服务器建立

基于java网络聊天室---前言

很久之前做的一个东西,现在拿出来整理一下放在自己的博客中! 一. 设计目的 随着人互联网的发展,人和人之间的沟通方式也越来越便捷和多样化,在线聊天工具已经成为人们生活中够通不可缺少的部分,在学习完 java网络编程课程,如果能开发一款属于自己的聊天工具,和好友进行私密对话,则是一件令人兴奋的事.同时,安全可靠的TCP这两种 通信协议,是非常重要的内容,值得研究. 二. 设计内容 本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆