VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用VB创建自己的通信程序
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10253, 日期:2001-06-29
用VB创建自己的通信程序
一 日, 与 表 哥 正 在FIFA98 中 鏖 战, 突 然 发 现FIFA98 中 的 对 话 通 信 程 序 特 别 有 趣, 其 时 我 正 与 表 哥 建 立 了 一 个 局 域 网, 想 到 如 果 能 够 创 建 一 个 象FIFA98 中 的 通 讯 程 序 的 话, 那 么 与 表 哥 对 话 就 方 便 多 了 ! 好 在Micsoft 公 司 推 出 了Windows 平 台 上 的 开 发 软 件:Visual Basic 5.0 中 文 企 业 版。 它 为Windows 环 境 下 的 网 络 开 发 提 供 了 强 大 的 工 具。Winsock 控 件 就 是 其 中 之 一。
---- Winsock 控 件 建 立 在TCP、UDP 的 协 议 基 础 上, 以 完 成 计 算 机 网 络 间 的 通 信。 下 面 将 详 细 的 介 绍 具 体 的 程 序 创 建 过 程, 以 便 使 大 家 更 好 的 理 解 程 序 的 源 代 码。

---- 服 务 器 端 程 序 的 运 行 过 程 是:

---- (4) 服 务 器 端 要 设 置 好 侦 听 端 口 即LocalPort 属 性, 作 为 侦 听 端 口 的 值 必 须 是 一 个 整 数( 一 定 要 是 其 它TCP/IP 应 用 程 序 没 有 用 过 的 值, 并 且 不 能 与 系 统 缺 省 端 口 冲 突)。

---- (5) 用Listen 方 法 进 入 侦 听 状 态, 等 待 客 户 机 的 连 接 请 求。

---- (6) 当 客 户 机 发 出 连 接 请 求 时, 使 服 务 器 产 生 一 个ConnectionRequest 事 件, 且 该 事 件 得 到 一 个 参 数requestID。

---- (7) 服 务 器 程 序 用Accept 方 法 接 受 客 户 机requestID 请 求。 这 样, 服 务 器 程 序 便 可 以 用SendData 方 法 来 发 送 数 据 了。 但 是,Accept 方 法 必 须 用 上 一 个 步 得 到 的requestID 作 为 其 参 数。

---- (8) 当 服 务 器 程 序 接 收 到 数 据 时, 便 会 产 生 一 个DataArrial 事 件, 参 数BytesTotal 包 含 接 收 到 的 数 据 字 节 数。 在 该 事 件 中, 可 以 用GetData 方 法 接 收 数 据。

---- (9) 如 果 接 收 到Close 事 件, 则 用Close 方 法 关 闭TCP/IP 连 接。

---- 客 户 机 的 程 序 的 运 行 过 程 是:

---- (8) 在 客 户 程 序 中 设 置Remmotehost 属 性, 以 便 指 定 运 行 服 务 器 程 序 的 主 机 名, 该 字 符 串 可 以 在 服 务 器“ 控 制 面 板| 网 络| 标 识| 计 算 机” 中 查 到。

---- (9) 设 置RemotePort 属 性, 以 便 指 定 服 务 器 程 序 的 侦 听 端 口( 其 设 置 方 法 与 服 务 器 端 类 似)。

---- (10) 使 用Connect 方 法, 向 服 务 器 提 出 连 接 请 求。

---- (11) 当 服 务 器 程 序 接 受 到 客 户 机 程 序 的 请 求 后, 客 户 机 程 序 产 生Connect 事 件, 就 可 以 用SendData 方 法 发 送 数 据 了。

---- (12) 当 客 户 机 程 序 接 收 到 数 据 时, 便 会 产 生DataArrival 事 件, 参 数BytesTotal 包 含 接 收 到 的 数 据 字 节 数。 类 似 的 在 该 事 件 中 也 可 以 用GetData 方 法 接 收 数 据。

---- (13) 如 果 客 户 机 程 序 接 收 到Close, 则 用Close 方 法 关 闭 连 接。

---- 使 用 说 明:

---- 本 程 序 实 现 了 两 台 计 算 机 之 间 的 自 由 通 信。 先 将 编 译 好 的 程 序 分 别 放 入 两 台 已 联 网 的 计 算 机 的| 开 始| 启 动| 中, 这 样 每 次 启 动 时, 程 序 将 会 自 动 运 行, 程 序 启 动 时 将 以 最 小 化 的 形 式 出 现 在 任 务 栏 中, 当 用 户 使 用 时 可 以 通 过 点 击 任 务 栏 上 的 该 程 序 图 标 来 激 活 该 程 序, 一 方 将 程 序 激 活 后, 在“ 请 输 入 所 要 连 接 的 主 机 名:“ 右 侧 的 编 辑 框 中 输 入 需 要 连 接 的 计 算 机 名, 并 敲“ 连 接” 键 便 可 连 接 成 功。 此 时 在“ 接 收 窗 口:” 下 的 编 辑 框 中 将 会 出 现“ 连 接 成 功” 的 提 示。 然 后 就 可 以 在“ 发 送 窗 口:” 下 的 编 辑 框 中 输 入 要 说 的 话 了, 输 入 完 毕 后 敲“ 发 送” 键 后 便 可 使 另 一 方 收 到 你 的 话 了, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 另 一 方 程 序 将 发 出 提 示 音 并 使 任 务 栏 中 程 序 的 图 标 闪 烁, 直 到 另 一 方 将 程 序 激 活 为 正 常 化 并 与 你 对 话 为 止。 如 果 暂 时 停 止 对 话 可 以 点 击 该 程 序 的 极 小 化 按 钮 将 程 序 最 小 化, 一 旦 需 要 再 次 通 话 可 直 接 激 活 该 程 序 发 送 过 去, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 程 序 仍 将 发 出 提 示 音 并 使 开 使 栏 中 程 序 的 小 图 标 闪 烁, 直 到 另 一 方 将 程 序 正 常 化 并 与 你 对 话 为 止。 所 以, 无 论 什 么 时 候 想 与 对 方 通 话 只 要 对 方 开 了 机 便 可 以 实 现。 当 需 要 断 开 连 接 时 请 按“ 关 闭” 键, 该 程 序 能 自 动 发 送 结 束 消 息, 使 对 方 能 够 知 道 你 已 断 开 连 接, 以 结 束 程 序 运 行。

---- FORM 的 构 造 如 下:

---- Timer 控 件----MMXControl 控 件 ----Gettest 控 件

---- Winsock 控 件----CommandButton 控 件----Test 控 件

---- 一 段 的 源 程 序 如 下:

Dim sign As Boolean
Dim flashsign As Boolean
Dim con As Boolean

Private Sub transfer_Click()
On Error GoTo transfererror
Timer1.Enabled = False
gettext.Text = " 陈 涛 说:" + sendtext.Text + Chr(13) + Chr(10) + gettext.Text
Dim say As String
If sign = True Then
say = " 陈 涛 说:" + sendtext.Text + Chr(13) + Chr(10)
Winsockout.SendData say
Else
say = " 陈 涛 说:" + sendtext.Text + Chr(13) + Chr(10)
Winsock1.SendData say
End If
sendtext.Text = ""
Exit Sub
transfererror:
    Dim a As String
a = " 计 算 机 还 没 有 进 入 网 络 或 者
是 它 的 相 应 程 序 没 有 运 行 !"
    MsgBox (a)
    End
Exit Sub
End Sub
Private Sub conbut_Click()
On Error GoTo connecterror
Winsockout.RemoteHost = hostnametext.Text
Winsockout.Connect
sign = True
conbut.Default = False
transfer.Default = True
Exit Sub
connecterror:
    Dim a As String
a = " 计 算 机 还 没 有 进 入 网 络 或 者 是
它 的 相 应 程 序 没 有 运 行 !"
    Dim b As String
    b = " 要 连 接 的 机 器 名 输 入 错 误,"
    MsgBox (b + a)
    End
Exit Sub
End Sub

Private Sub exitbut_Click()
On Error GoTo exiterror
If con = True Then
End
End If
If sign = True Then
Winsockout.SendData " 中 断 联 接!"
Else
Winsock1.SendData " 中 断 联 接!"
End If
Exit Sub
exiterror:
    Dim a As String
a = " 计 算 机 还 没 有 进 入 网 络 或 者 是
它 的 相 应 程 序 没 有 运 行 !"
    MsgBox (a)
    End
Exit Sub
End Sub

Private Sub Form_Load()
Winsock1.Listen
sign = False
flashsign = True
Timer1.Enabled = False
con = False
conbut.Default = True
End Sub


Private Sub hostnametext_Change()
conbut.Enabled = True
End Sub

Private Sub Timer1_Timer()
If Form1.WindowState = 1 Then
If flashsign = True Then
Form1.Icon = LoadPicture(App.Path + "\zhcn010.ico")
flashsign = False
ElseIf flashsign = False Then
Form1.Icon = LoadPicture(App.Path + "\zhcn020.ico")
flashsign = True
End If
End If
End Sub

Private Sub Winsock1_Close()
conbut.Enabled = True
hostnametext.Enabled = True
Winsock1.Close
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> 0 Then
Winsock1.Close
End If
transfer.Default = True
If Form1.WindowState = 1 Then
Timer1.Enabled = True
MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
End If
conbut.Enabled = False
hostnametext.Enabled = False
sendtext.Enabled = True
gettext.Enabled = True
gettext.Text = " 连 接 成 功!" + Chr(13) + Chr(10)
sign = False
Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String
If Form1.WindowState = 1 Then
Timer1.Enabled = True
MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
End If
Winsock1.GetData str
If str = " 中 断 联 接!" Then
con = True
Winsock1.SendData " 可 以 中 断 联 接!"
ElseIf str = " 可 以 中 断 联 接!" Then
End
End If
gettext.Text = str + gettext.Text
End Sub
Private Sub Winsockout_Close()
hostnametext.Enabled = True
Winsockout.Close
End Sub

Private Sub Winsockout_Connect()
Form1.WindowState = 0
gettext.Enabled = True
sendtext.Enabled = True
conbut.Enabled = False
gettext.Text = " 连 接 成 功!" + Chr(13) + Chr(10)
End Sub

Private Sub Winsockout_DataArrival(ByVal bytesTotal As Long)
Dim tempstr As String
If Form1.WindowState = 1 Then
Timer1.Enabled = True
MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
End If
Winsockout.GetData tempstr
If tempstr = " 中 断 联 接!" Then
con = True
Winsockout.SendData " 可 以 中 断 联 接!"
ElseIf tempstr = " 可 以 中 断 联 接!" Then
End
End If
gettext.Text = tempstr + gettext.Text
End Sub


---- 说 明:

---- 在 以 上 程 序 中, 包 括 两 个Winsock 控 件 一 个 是 服 务 器 端 的, 另 一 个 是 客 户 端 的, 以 此 来 实 现 相 互 通 信 的 目 的。 现 将 程 序 中 的 重 要 部 件 的 主 要 属 性 列 表 如 下( 以 下 的 各 表 格 的 起 头 均 为 控 件 的Name 属 性):

Form1   
MaxButton
False
MinButton
True
Windowstate
1-Minimized
Winsock1
LocalPort
2000
RemotePort
0
Winsockout
LocalPort
2001
RemotePort
0
Timer1
Interval
500
gettext
Height
1695
Top
1080
Left
525
Width
5055
MultiLine
True
LinkTimeout
50


另 一 端 的 源 程 序 如 下:
Dim sign As Boolean
Dim p As String
Dim q As String
Dim flashsign As Boolean
Dim con As Boolean
Private Sub transfer_Click()
On Error GoTo transfererror
Timer1.Enabled = False
gettext.Text = " 闵 锐 说:" + sendtext.Text + Chr(13) + Chr(10) + gettext.Text
Dim say As String
If sign = True Then
say = " 闵 锐 说:" + sendtext.Text + Chr(13) + Chr(10)
Winsockout.SendData say
Else
say = " 闵 锐 说:" + sendtext.Text + Chr(13) + Chr(10)
Winsock1.SendData say
End If
sendtext.Text = ""
Exit Sub
transfererror:
    Dim a As String
a = " 计 算 机 还 没 有 进 入 网 络 或 者 是
它 的 相 应 程 序 没 有 运 行 !"
    MsgBox (a)
    End
    Exit Sub
End Sub
Private Sub conbut_Click()
On Error GoTo connecterror
Winsockout.RemoteHost = hostnametext.Text
Winsockout.Connect
sign = True
conbut.Default = False
transfer.Default = True
Exit Sub
connecterror:
    Dim a As String
    a = " 要 连 接 的 机 器 名 输 入 错 误,"
    Dim b As String
b = " 计 算 机 还 没 有 进 入 网 络 或 者
是 它 的 相 应 程 序 没 有 运 行 !"
    MsgBox (a + b)
    End
    Exit Sub
  End Sub
Private Sub exitbut_Click()
On Error GoTo exiterror
If con = True Then
End
End If
Dim f As String
f = " 中 断 联 接!"
If sign = True Then
Winsockout.SendData f
Else
Winsock1.SendData f
End If
Exit Sub
exiterror:
    Dim a As String
a = " 计 算 机 还 没 有 进 入 网 络 或 者
是 它 的 相 应 程 序 没 有 运 行 !"
    MsgBox (a)
    End
    Exit Sub
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
p = App.Path + "\zhcn010.ico"
q = App.Path + "\zhcn020.ico"
Winsock1.Listen
sign = False
con = False
flashsign = True
End Sub

Private Sub hostnametext_Change()
conbut.Enabled = True
End Sub

Private Sub Timer1_Timer()
If Form1.WindowState = 1 Then
If flashsign = True Then
Form1.Icon = LoadPicture(p)
flashsign = False
ElseIf flashsign = False Then
Form1.Icon = LoadPicture(q)
flashsign = True
End If
End If
End Sub
Private Sub Winsock1_Close()
conbut.Enabled = True
hostnametext.Enabled = True
Winsock1.Close
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> 0 Then
Winsock1.Close
End If
Form1.transfer.Default = True
If Form1.WindowState = 1 Then
Form1.MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
Timer1.Enabled = True
End If
conbut.Enabled = False
hostnametext.Enabled = False
sendtext.Enabled = True
gettext.Enabled = True
gettext.Text = " 连 接 成 功!" + Chr(13) + Chr(10)
sign = False
Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String
If Form1.WindowState = 1 Then
Timer1.Enabled = True
Form1.MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
End If
Winsock1.GetData str
If str = " 中 断 联 接!" Then
Winsock1.SendData " 可 以 中 断 联 接!"
con = True
ElseIf str = " 可 以 中 断 联 接!" Then
End
End If
gettext.Text = str + gettext.Text
End Sub

Private Sub Winsockout_Close()
hostnametext.Enabled = True
Winsockout.Close
End Sub

Private Sub Winsockout_Connect()
Form1.WindowState = 0
gettext.Enabled = True
sendtext.Enabled = True
conbut.Enabled = False
gettext.Text = " 连 接 成 功!" + Chr(13) + Chr(10)
End Sub

Private Sub Winsockout_DataArrival(ByVal bytesTotal As Long)
Dim tempstr As String
Timer1.Enabled = True
If Form1.WindowState = 1 Then
Form1.MMControl1.Notify = False
Form1.MMControl1.Wait = True
Form1.MMControl1.Shareable = False
Form1.MMControl1.DeviceType = "waveaudio"
Form1.MMControl1.filename = App.Path + "\mcitest.wav"
Form1.MMControl1.Command = "Open"
Form1.MMControl1.Command = "play"
Form1.MMControl1.Command = "prev"
End If
Winsockout.GetData tempstr
If tempstr = " 中 断 联 接!" Then
Winsockout.SendData " 可 以 中 断 联 接!"
con = True
ElseIf tempstr = " 可 以 中 断 联 接!" Then
End
End If
gettext.Text = tempstr + gettext.Text
End Sub

控 件 属 性:
Winsock1
LocalPort
2001
Winsockout
LocalPort
2000

---- 其 他 控 件 的 属 性 与 上 相 同。
---- 说 明:
---- 以 上 的 代 码 是 能 够 互 换 的, 经 编 译 后 便 可 运 行 在 台 已 联 网 的 计 算 机 中。 程 序 中mcitest . Wav 、zhcn010 . Ico 、zhcn020 . Ico 是 声 音 文 件 和 图 标 可 以 更 换。
---- 注 意: 请 一 定 要 确 定 在 两 台 已 联 网 的 计 算 机 上 已 分 别 运 行 了 该 程 序, 以 免 发 生 不 必 要 的 错 误。
---- 本 程 序 在 两 台PII233、32MB 内 存、 以NE2000 网 卡 互 连、 在WINDOWS95 中 文 版、VISUAL BASIC 5.0 中 文 企 业 版 的 环 境 下 编 译 运 行 成 功。