QQ聊天功能在局域网中的实现
蒲应文

《软件报》33期

编程语言:Basic编程工具:Visual Basic 6.0

【编程引子】

随着信息化建设步伐的加快,各公司都开始了局域网办公,其中利用Windows的信使服务功能实现各部门之间的联系已是常事,今天我们一起来设计一个局域网信使程序,本文在程序设计过程中没有使用任何网络组件和网络协议,只是使用了VB中的基本控件,编程难度不大,给初学者朋友提供了一个好的学习平台。来吧,一起看看本文的设计思想和方法!

【编程分析】

网络程序设计一般都要用到网络组件或网络协议,而本文则抛开这一切与网络相关的概念,采用“数据库+文件夹共享”方式实现在局域网内传递信息,乃至于聊天。

本程序只有一个执行程序和一个数据库文件,不分服务端和客户端,使用时,在服务器上共享一个文件夹,并将本程序和数据库置于其中,然后在客户端通过局域网运行本程序,发出消息后存入服务端数据库,各登陆用户从数据库中智能的提取各自的消息。即以共享文件夹中的数据库为桥梁实现数据传递。

【设计步骤】

一、数据库设计

使用VB自带的可视化数据管理器(VisData)创建数据库LanMsg.mdb,其中包括两个数据表user和message,user表用于管理聊天用户,其中包括3个字段:用户、密码、性别,message表用于保存聊天记录,其中包括5个字段:时间、用户、消息、接收者、状态,除“消息”字段为备注型(Memo),其它字段均为字符型(String)。

二、程序设计

本文重点介绍局域网聊天功能的实现,操作数据库选用最简单的Data控件,其方法完全适用于Adodc控件,只是连接数据库的代码和数据库记录操作的语法格式有所不同。

1、新用户注册

启动VB,新建一工程,添加一个窗体reg和必要的控件,新用户注册就是把新用户的注册信息写入数据库。编程方法和代码如下:

’连接数据库,MdbFn是数据库文件名

Data1.DatabaseName = MdbFn

Data1.RecordSource = "select * from user where 用户=’" + MyName + "’"

Data1.Refresh ’MyName是登陆用户自己的名字,下同

If Data1.Recordset.RecordCount > 0 Then

’用户存在则退出,代码略

End If

Data1.Recordset.AddNew

Data1.Recordset.Fields("用户").Value = Text1.Text

Data1.Recordset.Fields("密码").Value = Text2.Text

Data1.Recordset.Fields("性别").Value = Combo1.Text

Data1.Recordset.Update

2、用户登陆

用户登陆是对用户的一个身份验证,如同QQ一样,本程序设计了“记住密码”、“自动登陆”功能,可以方便用户在运行程序后不用输入用户名和密码就可以自动登陆,这些信息保存在注册表中,通过VB中的SaveSetting和GetSetting函数完成。

向工程添加一个窗体Login和必要的控件,并把此窗体设置为启动窗体。这个窗体中需要完成数据库绝对路径的设置。程序代码如下:

Pa = App.Path

If Right(Pa, 1) <> "/" Then

ShareName = Pa

Pa = Pa + "/" ’子目录

End If

MdbFn = Pa + App.EXEName + ".mdb"

If Dir(MdbFn) = "" Then Exit Sub

注:ShareName是程序和数据库的绝对路径,不包括最后的“/”符号,在后文中使用,该文件夹将被共享。上面的代码表明:如果程序在根目录下运行则不共享(出于安全考虑)。

登陆时检查用户是否存在、密码是否正确,并保存用户名,登陆方式到注册表,代码如下:

Data1.RecordSource = "select * from user where 用户=’" + MyName + "’"

Data1.Refresh ’用户不存在则退出

If Data1.Recordset.RecordCount = 0 Then Exit Sub

If Data1.Recordset.Fields("密码").Value <> Text2.Text Then

MsgBox "密码错误!" : Exit Sub

End If

’保存用户名信息,保存其它信息的代码略

SaveSetting App.Title, App.EXEName, "UserName", MyName

3、主界面设计

向工程添加一个窗体main和必要的控件。这个窗体模仿了QQ的主界面,能在屏幕四周任意位置隐藏(包括任务栏所在的一方,QQ则不能,代码参见源码)。

1)程序所在文件夹的共享和取消

程序在本机运行时自动共享程序所在的文件夹(所有权限),本程序为了提高程序和数据库的安全性(不被删除),在程序退出时自动取消文件夹的共享。在程序运行期间,程序和数据库处于工作状态,网上邻居的用户无法删除。文件夹的共享和取消通过调用Windows(Nt结构)中的Net命令完成,命令方式为:

共享:net share LanMsg$=ShareName /unlimited

取消:net share LanMsg$ /delete

上面命令中,share是net命令的参数,表示创建或取消共享文件夹,LanMsg$是共享后的名称,以$结尾能使其在网上邻居中不被显示,这样是为了隐藏共享文件夹,但输入路径可以访问。

是不是本机的判断用程序路径的前两个字符,非本机的程序路径以“//”开头,而本机的程序路径则以盘符开头。编程方法和代码如下:

’本机运行时共享所在文件夹

ShareCmd = "net share LanMsg$=" + ShareName + " /unlimited"

If Left$(Pa, 2) <> "//" Then

If ShareName <> "" Then WinExec ShareCmd, vbHide

End If ’调用API函数WinExec执行命令

’本机退出时取消所在文件夹共享

If Left$(Pa, 2) <> "//" Then

ShareCmd = "net share LanMsg$ /delete /y"

If ShareName <> "" Then WinExec ShareCmd, vbHide

End If ’参数/delete表示取消文件夹共享

2)检查是否有消息

For i = 0 To Num

’Num是用户的编号,Xm是显示姓名的标签数组

Usr = Xm(i).Caption

Data2.RecordSource = "select * from message where 接收者=’" + MyName + "’ and 状态=’未读’ and 用户=’" + Usr + "’"

Data2.Refresh ’即:筛选其它用户(Usr)发出的MyName(自己)接收的未读(状态)的记录

If Data2.Recordset.RecordCount > 0 Then

’有消息来,此时改变标签的颜色以达到闪烁效果,并产生音效,代码略

End If

Next

3)消息的收发

添加一个窗体Chat和必要的控件。当有消息来时,点击用户姓名可进入消息收发窗体,消息接收用定时器监测,并显示在文本框中,读出数据后,将相应记录状态修改为“已读”。编程方法和代码如下:

’连接数据库代码略

If Data1.Recordset.RecordCount > 0 Then

While Not Data1.Recordset.EOF

’逐个读出信息到文本框,代码略

Data1.Recordset.Edit ’修改状态

Data1.Recordset.Fields("状态").Value = "已读"

Data1.Recordset.Update

Data1.Recordset.MoveNext

Wend

End If

消息的发出通过向数据库message表中添加记录实现,和添加用户的代码相似,略。

4)历史记录查询

添加一个窗体View和必要的控件。本文查询历史记录的方法和收取消息的方法相同,只是记录筛选的条件中只处理“已读”状态的记录,代码略。

5)消息记录的清除

为了防止别人偷看消息内容,本文设计了消息记录的清除功能,客户端用户可以清除自己发出的消息,而本机登陆的用户可以删除某个用户或所有用户的消息。编程方法和代码如下:

Sub DelMsg(TheName)

Data2.RecordSource = "select * from message where 用户=’" + TheName + "’"

Data2.Refresh

While Not Data2.Recordset.EOF

Data2.Recordset.Delete

Data2.Recordset.MoveNext

Wend

End Sub

6)用户的注销

对于使用本程序乱发消息的用户,本机登陆的用户有权注销非本机登陆的用户,注销用户的同时删除其所有消息记录,编程方法和删除记录的方法相似,只是处理的数据表变为user,代码略。

7)程序开机自动运行

程序设计了开机自动运行功能,这个功能通过调用API函数在注册表运行组添加项目而实现,本文使用的是注册表中的默认键名,编程方法和代码如下:

’相关API的声明略

Sub pAutoRun(AppName As String)

sKeyName = "Software/Microsoft/Windows/CurrentVersion/Run"

Ret = RegCreateKey&(HKEY_LOCAL_MACHINE, sKeyName, hKey)

Ret = RegSetValue(hKey&, "", REG_SZ, AppName, 0&)

Ret = RegCloseKey(hKey)

End Sub

8)其它功能

本程序还设计了重新登陆、刷新用户、自动隐藏主窗体等众多功能,详细代码参见源码。

【编程后记】

本文为实现局域网消息传递功能,在设计思想上新颖,保证了执行程序和数据库的安全,但本程序在共享所在文件夹时给出了所有权限(发出的消息才能写入数据库),这为黑客的攻击提供了可乘之机,特别是局域网连接了互联网的朋友在没有安全可靠的防火墙保护下,在局域网内应慎重使用本程序。希望本程序在为你带来方便的同时也能给你带去好运和安全!

QQ聊天功能在局域网中的实现相关推荐

  1. 基于 WebSocket、Spring Boot 教你实现“QQ聊天功能”的底层简易demo

    目录 前言 一.分析 1.1.qq聊天功能分析 1.2.WebSocket介绍 1.2.1.什么是消息推送呢? 1.2.2.原理解析 1.2.3.报文格式 二.简易demo 2.1.后端实现 2.1. ...

  2. 手机web页面调用打开QQ聊天功能(个人项目经验)

    在实现手机web功能时候,会出现咨询页面客服的需求,此时客服使用的是QQ方式交流,就要求能够调用手机QQ的聊天功能,这个其实很简单,希望下面的分享会对各位博友有用. 在代码中添加点击事件: <a ...

  3. go语言实现仿QQ聊天功能

    1.实现原理 为了最大限度的减少服务器的负担,这里使用P2P模式实现仿QQ的聊天功能,服务器端和客户端职责如下: 1)服务器端:通过TCP方式实现客户端身份认证.向已经认证的用户推送好友信息.向其他登 ...

  4. android调用qq聊天功能

    String url="mqqwpa://im/chat?chat_type=wpa&uin=2853700237"; startActivity(new Intent(I ...

  5. 教你如何在网站上挂qq聊天功能

    QQ在线聊天代码,可以用做网页在线客服,还是免费的,呵 <A href="http://wpa.qq.com/msgrd?V=1&Uin=272000556&Site= ...

  6. 使用Qt5.9实现qq聊天功能(TCP通信)

    利用Tcp协议在Qt里面实现通信,注意:客户端和服务端的网段必须在同一个网段才可以,要不然连接不上.并且改代码能够解决中文乱码问题.字符串.中文都可以发送. 服务器端代码: 首先在.pro文件加入: ...

  7. QQ聊天记录保存在哪个文件里?

    问:最近我想重装QQ,但这样会丢失QQ聊天记录.我不是QQ会员,但我想将我的聊天记录保留下来,新装QQ后能继续看见,我应该怎么做?QQ聊天记录保存在哪个文件里? 答:QQ聊天记录保存的文件是: 盘符( ...

  8. 利用swipelistview完成qq聊天列表右滑删除功能

    感谢HarryWeasley整理:http://blog.csdn.net/harryweasley/article/details/41413547 前言:前段时间,由于自己比较悠闲,没有什么工作上 ...

  9. 一键QQ聊天与一键加群QQ功能

    最新有项目要求,点击页面上的一个按钮,实现直接启动QQ聊天,添加QQ群的功能. 开始以为会很复杂,百度后发现QQ已经有考虑到这方面的需求,只需进入:QQ推广 -> 推广工具 就能看到如下界面 Q ...

最新文章

  1. [BZOJ4557][JLOI2016]侦查守卫
  2. 如何0代码、快速定制企业级NLP模型?百度工程师详解技术选型与模型调优策略...
  3. Hexo+OSChina(码云)+git 搭建个人博客
  4. 学会用好 Visual Studio Code
  5. r语言数据变量分段_R数据分析:用R语言做meta分析
  6. ajax async
  7. linux_NandFlash_driver_超详细分析 .
  8. Python,入门1
  9. CentOS 7.5 重置 root 密码
  10. php要学ps吗,小蚂蚁学习PS切图(3)——小练习
  11. python发送文件_利用python传送文件
  12. java excel 导出加密
  13. pd.diff()函数详解
  14. 适合送礼的真无线蓝牙耳机南卡小音舱开箱测评!
  15. 当年谷歌为什么退出中国?
  16. IE8的调试工具使用详解(下)
  17. NLP-文本处理:词性标注【使用成熟的第三方工具包:中文(哈工大LTP)、英文()】【对分词后得到的“词语列表”进行词性标注,词性标注的结果用于依存句法分析、语义角色标注】
  18. OpenLayers使用
  19. 5G手机即将上市,新的创业风口来了!
  20. Java进阶必读书籍推荐

热门文章

  1. 合宙ESP32C3上手使用
  2. C++四种类型转换总结
  3. 异步fifo设计及验证verilog代码
  4. FFmpeg+OpenGL ES+OpenSL ES打造Android视频播放器课程总结
  5. 应届毕业生Android面试经验小谈
  6. 情人节程序员用HTML网页表白【520爱心背景3D相册】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  7. 物联网还有哪些创业机会?
  8. 2012 成都网络赛小记
  9. 广播风暴的产生原因和原理是什么?
  10. 【活动】高效学习方法分享