登录
首页 >  Golang >  Go教程

GO使用socket和channel实现简单控制台聊天室

来源:脚本之家

时间:2023-01-14 12:12:25 200浏览 收藏

本篇文章向大家介绍《GO使用socket和channel实现简单控制台聊天室》,主要包括go控制台、聊天室,具有一定的参考价值,需要的朋友可以参考一下。

使用socket和channel,实现简单控制台聊天室

这里使用socket和channel,演示在GO中如何编写一个简单网络程序

功能分析

聊天室主要功能:用户可以加入/离开聊天室;每个用户发送的消息,广播给所有人
聊天室分为客户端和服务端,客户端负责发送消息和打印服务器消息,服务器负责接收客户端消息,并广播给所有人
客户端可以使用telnet程序
服务端是需要实现的。需要实现的功能,

  1. 如何保存多个客户端的连接,管理连接的接入与断开
  2. 如何接收和广播客户端消息

实现思路

通过功能分析,拆分为聊天室结构体和客户端结构体
聊天室结构体负责管理当前接入的客户端和广播消息
客户端结构体负责管理socket连接和需要接收与发送的数据
客户端连接/断开时通知聊天室;客户端发送的消息实际是转发给聊天室,然后聊天室再广播出去

完整代码

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
)

type Client struct {
	id      string
	conn    *net.Conn
	message chan string
}

type Hub struct {
	clients  map[*Client]bool
	entering chan *Client
	leaving  chan *Client
	messages chan string
}

func main() {
	hub := &Hub{
		clients:  make(map[*Client]bool),
		entering: make(chan *Client),
		leaving:  make(chan *Client),
		messages: make(chan string),
	}

	listener, err := net.Listen("tcp", ":8000")
	if err != nil {
		log.Fatal(err)
	}
	go hub.broadcaster()
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Println(err)
			continue
		}
		go hub.handleConn(conn)
	}
}

func (hub *Hub) broadcaster() {
	for {
		select {
		case msg := 

分析

实现的关键是封装了客户端通信channel,无论是远程发送过来的消息还是聊天室广播的消息,都通过这个channel传递,且这个channel是绑定客户端的
参考链接中,直接使用channel来定义客户端type client chan,其实更能表达这一点
为了容易理解,这里将channel封装为客户端的一个通信管道,客户端还可以有别的属性,例如:id、连接和超时时间等

参考: Go 网络编程示例

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《GO使用socket和channel实现简单控制台聊天室》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>