局域网群聊工具

news/2024/11/17 2:34:03/

这篇文章所要讲的局域网聊天工具是基于udp协议的,至于为什仫要使用udp协议,当然是为了更加深入的理解socket套接字编程了。有的读者就会问了那你为什仫不用tcp协议呢?因为之前已经写过了一个关于tcp协议的项目了啊。 http服务器
一、聊天室的原理
这个聊天室是可以达到类似QQ群聊的目的的。客户端向服务器发送消息,服务器将这条消息进行转发(转发其实就是利用了生产者消费者模型,生产者从网络中抓取数据,消费者向网络中发数据)。之前提到了用的是udp协议,所以服务器会维护一张用户列表,在这个用户列表中保存了向服务器发送消息的客户的信息(包括该用户的昵称、学校、发送的消息正文),当有新用户到来的时候会更新该用户列表。当有用户退出的时候,该用户会向服务器发送一条特殊的指令,将其从用户列表中删除。
原理图

二、聊天工具的实现机制
服务器
1、用户列表
因为使用的是udp协议,所以该服务器要维护一张用户列表,所谓的用户列表其实使用的是STL中的map,IP做key,sockaddr_in做value。
用户列表
2、数据池
其实数据池就是用来存放数据的,生产者往数据池里面放数据,消费者从该数据池中获得数据。实际上就是上面原理图中的环形队列。数据池可以选取STL中的vector或者是list,我选的是vector;同时也要考虑生产者和消费者线程数据同步的问题。
数据池

客户端
3、客户端的界面–>ncurses
我为客户端编写的一个简单的界面,在这里用到了ncurses界面库,将屏幕切分成四部分,见下图:
界面库

在窗口类中明确定义了如何画出这四个区域,窗口类的定义如下:

窗口类

4、维护这四个窗口的是四个线程,在代码内部实现。

5、序列化与反序列化–>json
为什仫要进行序列化呢?试想一下你在QQ群里聊天你发送了一条消息却没有显示是谁发的,这是不是很奔溃,想找好友都找不到了。。。此时可以给客户端设置了多个信息。序列化就是将用户的信息和从数据区域输入的消息进行组装成一个字符串,反序列化就是将这一个字符串拆分成若干信息。
用户的数据类型:
datatype

6、客户端如何退出
可以看到在数据类型的类中定义了cmd这个参数,就是用来存储用户退出信号的。可以注册一个信号处理函数,在信号处理函数中将cmd字段的值设置为非空,服务器拿到数据的时候,先反序列化解析出cmd的值,判断是不是退出的信息,如果是的话就将该用户从用户列表删除。
三、操作界面

操作

点击查看源码

在这里就分享结束了~~~


http://www.ppmy.cn/news/933716.html

相关文章

局域网聊天9月局域网聊天

摘要:2012年06月07日局域网聊天9月局域网聊天遗诏命皇太孙朱允炆继位,我的小乌龟太胆小了,缩略图标题内容2007年5月3日下午,孔老汉赶忙放下手中的活儿循声望去,轻轻一碰鱼缸,山东济南济南市历城区双语学校二…

简易局域网聊天QQ

简易局域网聊天系统–局域网QQ 服务器端 实现简易的启动停止服务器端操作,能记录基本日志:客户连接、消息传送,能查看连接客户的昵称。 启动服务器后开始监听客户端连接,创建一个新线程实现该监听操作。 // 启动新线程监听客户…

Vtalk局域网聊天室 基于Python

服务端: #作者:吴子豪 #服务器启动程序 import os import threading,socket,time,datetime,sys#每次运行都清空日志 saveservermsgopen("#Serverlog.hst", w) saveservermsg.close()#服务器配置 hostsocket.socket(socket.AF_INET,socket.SOCK_STREAM) h…

Web聊天室

目录 一,简介 二,开发环境 三,涉及的技术 四,主要功能 1.注册功能 2.登录功能 3.异地登陆(第一次登录网页会被强制退出) 4.发送消息 5.接收消息 6.注销登录 五,准备工作 1.引入开发…

局域网聊天系统-Java

这个局域网聊天系统,是为了能够在一个没有连接到intent的局域网中,进行聊天的一个程序。本程序包括服务器和客户机两部分,可以实现多人聊天和两个人私聊的一个工具。 开发语言:Java,开发工具:eclipse。 客户…

Java实现局域网聊天软件分享

前言 翻翻u盘里面的东西,发现了自己以前实现的局域网聊天软件。这里共享出来给各位学习 Java的童鞋。对知识的渴望源自于人的内心,对知识的分享也源自于人的本性。 功能罗列 啥功能笔者就不去重新实践了,简单的罗列下功能列表: 1. 消息发送&a…

Java实现多线程局域网聊天室

Java多线程局域网聊天室 局域网聊天室1.TCP2.套接字3.C/S架构4.多线程5.服务器客户端 局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c而轻视java的心态,搞了一个多线程的聊天室,熟悉了一下服务器…

局域网内互发消息

主机相互发送消息 背景 本学期的计算机网络课非常有意思,它与我们的生活息息相关,曾经我也为电脑发生的网络问题而困惑,总是没有根据的瞎尝试来试图解决问题。但是在老师的一些简单指导之后,有了一个基本的ip之间通信以及局域网…