PaperTan: 写论文从未如此简单

计算机应用

一键写论文

用VB实现聊天讨论室和点对点会话

作者:未知 时间:2007-04-12

本文介绍了一种基于Winsock和VB开发的聊天室和对话系统,用于解决单位内部或行业内部计算机互联时点对点实时对话的难题。系统利用Winsock控件的主要属性、事件和方法,通过两个表单分别模拟客户端和服务器端,实现了聊天室功能。客户端表单包含输入框、显示框、连接按钮、发送按钮等控件,服务器端表单用于监听和接收信息。通过编程实现连接、发送、接收和关闭连接等功能,并在VB6.0中编译运行成功。该系统可用于网络中的固定机器地址作为聊天讨论室,其他用户可连接进入聊天或讨论,也可进行点对点对话,为同行提供参考。

在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intranet虽然可以建立聊天室,但实现点对点实时对话却比较困难。本人用Winsock和VB自制了一套聊天室和对话系统,特拿来供同行们参考。

一・Winsock的主要属性、事件和方法

Winsock是不可见控件,控件文件名是MSWINSCK.OCX,全称为Mcirosoftwinsockcontro,使用时要将此控件调入工具箱。

1・属性:①Protoco=0//使用TCP协议;

②RemoteHost//准备连接远程机的IP地址

③RemotePort//连接远程机的IP端口号(1024―65535之间)

④LocaPort//本地机监听IP端口号必须与呼叫机端口号相同

2・方法:①connect//申请连接远程机

②isten//设置监听

③accept//建立实际连接

④senddata//发送数据

⑤getdata//接收数据

⑥cose//关闭连接

3・事件:①connectionrequest//一方请求连接时另一方产生

②connect//一方机接受连接时另一方产生

③cose//一方机关闭连接时另一方产生

④dataArriva//一方发送数据另一方产生

⑤error//请求连接失败时产生

二・制作方法

⑴在一工程中添加两个表单form1(模拟客户端)、form2(模拟服务器端)。

form1中装入控件:

控件名

主要属性

用途

VB.Formform1

caption=”雷萌聊天室”

controbox=0‘Fase

模拟客户机表单

VB.Textboxtext1

mutiine=-1‘True

scrobars=3‘Bath

用于输入发往聊天室的信息

VB.Textboxtext2

ocked=-1‘True

mutiine=-1‘True

scrobars=3‘Bath

显示从聊天室发来的信息

text=”10.84.234.11”‘任定默认地址

放入常用的地址

caption=”退出”

最小化form1

caption=”连接”

请求与输入的地址连接

caption=”发送”

发送Text1中的内容

VB.Labeabe1

caption=“请在此输入发表的信息”

Text1的框标

VB.Labeabe2

caption=“聊天室或对方的信息”

Text2的框标

VB.Labeabe3

caption=”等待连接”

显示连接状态信息

VB.Labeabe4

caption=”聊天室或对方地址”

用于指示Combo1

VB.Labeabe5

caption=”操作:选地址连接,连接成功看到聊天室内容后再输信息发送”

操作说明

VB.Timertimer1

interva=6000;enabed=fase

防止连接超时

MSWinsockib.winsocka

用于数据传输

form2中装入控件:

控件名

主要属性

用途

VB.Formform2

caption=”接收信息”

controbox=0‘Fase

模拟客户机表单

caption=”返回”

隐含Form2窗口

caption=”对话”

点对点会话时用此直接启动Form1

VB.Textboxtext1

ocked=-1‘True

mutiine=-1‘True

scrobars=3‘Bath

存放聊天或对话内容

VB.Labeabe1

caption=”接收的信息”

Text1的框标

MSWinsockib.Winsocka

用于监听

MSWinsockib.Winsockb

用于传送聊天信息

⑵在Form1的各控件事件中加入如下代码:

DimfagAsBooean注释:连接状态变量

PrivateSuba_Connect()

fag=True

EndSub

PrivateSuba_DataArriva(ByVabytesTotaAsLong)

DimiAsString

a.GetDatai

Labe3.Caption="连接成功!"

Comm2.MousePointer=0

Form1.MousePointer=0

Timer1.Enabed=Fase

Ifi=Chr(0)Then

Text2.Text="你是今天第一个进入本聊天室的客户。"+Chr(13)+Chr(10)

Ese

Text2.Text=Text2.Text+i

EndIf

Text2.SeStart=Len(Text2.Text)

Send.MousePointer=0

Combo1.Enabed=Fase

Comm2.Caption="断开连接"

Text1.SetFocus

EndSub

PrivateSuba_Error(ByVaNumberAsInteger,DescriptionAsString,ByVaScodeAsLong,ByVaSourceAsString,ByVaHepFieAsString,ByVaHepContextAsLong,CanceDispayAsBooean)

fag=Fase

Timer1.Enabed=Fase

Comm2.MousePointer=0

Form1.MousePointer=0

MsgBox"网络连接失败!"

Labe3.Caption="等待连接"

Combo1.Enabed=True

Combo1.SetFocus

a.Cose

Comm2.Caption="连接"

EndSub

Private Sub Comm1_Cick()

a.Cose 注释:关闭连接

Form1.WindowState = 1

End Sub

Private Sub Comm2_Cick()

If Comm2.Caption = "断开连接" Then

a.Cose

Comm2.Caption = "连接"

Labe3.Caption = "等待连接"

Combo1.Enabed = True

Timer1.Enabed = Fase

Comm2.MousePointer = 0

Form1.MousePointer = 0

Ese

Text2.Text = ""

Labe3.Caption = "正在连接.."

Comm2.MousePointer = 11

Form1.MousePointer = 11

Timer1.Enabed = True

fag = Fase

a.Protoco = sckTCPProtoco

a.RemoteHost = Combo1.Text

a.RemotePort = 3000

a.Connect

End If

End Sub

Private Sub Form_DbCick()

If MsgBox("关闭本聊天室! 确认吗?", 36, "退出系统") = 6 Then

End

Ese

Form1.WindowState = 1

End If

End Sub

Private Sub Form_Load()

If App.PrevInstance Then

MsgBox "本系统已经加载,请看任务拦!", 48, "提示"

End

End If

fag = Fase

Load Form2 ‘读入form2进入监听

End Sub

Private Sub Send_Cick()

Dim S As String

On Error GoTo ffff ‘防止链路中断

Send.MousePointer = 11

If Right(Text1.Text, 1) <> Chr(10) Then

S = Text1.Text + Chr(13) + Chr(10)

Ese

S = Text1.Text

End If

If fag Then

a.SendData S

End If

Exit Sub

ffff:

MsgBox "连接中断!", 48, "提示"

a.Cose

Send.MousePointer = 0

Comm2.Caption = "连接"

Labe3.Caption = "等待连接"

Combo1.Enabed = True

Comm2.MousePointer = 0

Form1.MousePointer = 0

Exit Sub

End Sub

Private Sub Timer1_Timer()

fag = Fase

Timer1.Enabed = Fase

Comm2.MousePointer = 0

Form1.MousePointer = 0

MsgBox "网络连接失败(超时) !"

Labe3.Caption = "等待连接"

Combo1.Enabed = True

Combo1.SetFocus

a.Cose

Comm2.Caption = "连接"

End Sub

⑶ 在Form2的各控件事件中加入如下代码:

Const maxn = 200 ‘最大同时连接本机的客户数

Dim user(maxn) As Booean

Private Sub Command1_Cick()

Form2.Hide

End Sub

Private Sub Command2_Cick()

Load Form1

Form1.Show

End Sub

Private Sub Form_Load()

Dim str1 As String

Form2.Caption = "雷萌通信软件"

注释:winsock控件 a 作为服务器程序监听

a.LocaPort = 3000

a.Listen

End Sub

Private Sub a_ConnectionRequest(ByVa requestID As Long)

Dim i As Long

For i = 1 To maxn ‘当一客户请求时给启动一Winsock控件标志号

If Not user(i) Then

user(i) = True

Exit For

End If

Next i

If i > maxn Then

Exit Sub

End If

Load b(i) ‘当一客户请求时启动一Winsock控件

b(i).Accept requestID 注释:实际建立连接

If Text1.Text = "" Then 注释:发送数据

b(i).SendData Chr(0)

Ese

b(i).SendData Text1.Text

End If

Form2.Show

End Sub

Private Sub s_Cose(Index As Integer)

b(Index).Cose 注释:关闭连接

Unoad b(Index) 注释:卸载 一个WinSock 控件

user(Index) = Fase

End Sub

Private Sub b_DataArriva(Index As Integer, ByVa bytesTota As Long)

Dim str As String

Dim i As Long

b(Index).GetData str

Text1.Text = Text1.Text + str

For i = 1 To maxn

If user(i) Then

b(i).SendData str

End If

Next i

End Sub

三・运行

本程序在VB6.0中编译通过,运行后最小化到任务栏上,也可以用API的She_Notifyicon 函数做入右下角的指示器栏中常驻内存。你可以在网络中用一个固定的机器地址作为聊天讨论室,其他用户都选该机地址连接进入该室聊天或讨论。各用户也可选各自熟悉的地址进行连接对话,双击form1空白处从内存中撤出系统。根据同样的原理可以制作电子邮件系统。