?? 88.htm
字號(hào):
<p>用VB創(chuàng)建自己的通信程序 </p>
<p></p>
<p>---- Winsock 控 件 建 立 在TCP、UDP 的 協(xié) 議 基 礎(chǔ) 上, 以 完 成 計(jì) 算 機(jī) 網(wǎng) 絡(luò) 間 的 通 信。 下 面 將 詳 細(xì) 的 介 紹 具 體 的 程 序 創(chuàng) 建 過(guò) 程, 以 便 使 大 家 更 好 的 理 解 程 序 的 源 代 碼。 </p>
<p></p>
<p>---- 服 務(wù) 器 端 程 序 的 運(yùn) 行 過(guò) 程 是: </p>
<p></p>
<p>---- (4) 服 務(wù) 器 端 要 設(shè) 置 好 偵 聽(tīng) 端 口 即LocalPort 屬 性, 作 為 偵 聽(tīng) 端 口 的 值 必 須 是 一 個(gè) 整 數(shù)( 一 定 要 是 其 它TCP/IP 應(yīng) 用 程 序 沒(méi) 有 用 過(guò) 的 值, 并 且 不 能 與 系 統(tǒng) 缺 省 端 口 沖 突)。 </p>
<p></p>
<p>---- (5) 用Listen 方 法 進(jìn) 入 偵 聽(tīng) 狀 態(tài), 等 待 客 戶(hù) 機(jī) 的 連 接 請(qǐng) 求。 </p>
<p></p>
<p>---- (6) 當(dāng) 客 戶(hù) 機(jī) 發(fā) 出 連 接 請(qǐng) 求 時(shí), 使 服 務(wù) 器 產(chǎn) 生 一 個(gè)ConnectionRequest 事 件, 且 該 事 件 得 到 一 個(gè) 參 數(shù)requestID。 </p>
<p></p>
<p>---- (7) 服 務(wù) 器 程 序 用Accept 方 法 接 受 客 戶(hù) 機(jī)requestID 請(qǐng) 求。 這 樣, 服 務(wù) 器 程 序 便 可 以 用SendData 方 法 來(lái) 發(fā) 送 數(shù) 據(jù) 了。 但 是,Accept 方 法 必 須 用 上 一 個(gè) 步 得 到 的requestID 作 為 其 參 數(shù)。 </p>
<p></p>
<p>---- (8) 當(dāng) 服 務(wù) 器 程 序 接 收 到 數(shù) 據(jù) 時(shí), 便 會(huì) 產(chǎn) 生 一 個(gè)DataArrial 事 件, 參 數(shù)BytesTotal 包 含 接 收 到 的 數(shù) 據(jù) 字 節(jié) 數(shù)。 在 該 事 件 中, 可 以 用GetData 方 法 接 收 數(shù) 據(jù)。 </p>
<p></p>
<p>---- (9) 如 果 接 收 到Close 事 件, 則 用Close 方 法 關(guān) 閉TCP/IP 連 接。 </p>
<p></p>
<p>---- 客 戶(hù) 機(jī) 的 程 序 的 運(yùn) 行 過(guò) 程 是: </p>
<p></p>
<p>---- (8) 在 客 戶(hù) 程 序 中 設(shè) 置Remmotehost 屬 性, 以 便 指 定 運(yùn) 行 服 務(wù) 器 程 序 的 主 機(jī) 名, 該 字 符 串 可 以 在 服 務(wù) 器“ 控 制 面 板| 網(wǎng) 絡(luò)| 標(biāo) 識(shí)| 計(jì) 算 機(jī)” 中 查 到。 </p>
<p></p>
<p>---- (9) 設(shè) 置RemotePort 屬 性, 以 便 指 定 服 務(wù) 器 程 序 的 偵 聽(tīng) 端 口( 其 設(shè) 置 方 法 與 服 務(wù) 器 端 類(lèi) 似)。 </p>
<p></p>
<p>---- (10) 使 用Connect 方 法, 向 服 務(wù) 器 提 出 連 接 請(qǐng) 求。 </p>
<p></p>
<p>---- (11) 當(dāng) 服 務(wù) 器 程 序 接 受 到 客 戶(hù) 機(jī) 程 序 的 請(qǐng) 求 后, 客 戶(hù) 機(jī) 程 序 產(chǎn) 生Connect 事 件, 就 可 以 用SendData 方 法 發(fā) 送 數(shù) 據(jù) 了。 </p>
<p></p>
<p>---- (12) 當(dāng) 客 戶(hù) 機(jī) 程 序 接 收 到 數(shù) 據(jù) 時(shí), 便 會(huì) 產(chǎn) 生DataArrival 事 件, 參 數(shù)BytesTotal 包 含 接 收 到 的 數(shù) 據(jù) 字 節(jié) 數(shù)。 類(lèi) 似 的 在 該 事 件 中 也 可 以 用GetData 方 法 接 收 數(shù) 據(jù)。 </p>
<p></p>
<p>---- (13) 如 果 客 戶(hù) 機(jī) 程 序 接 收 到Close, 則 用Close 方 法 關(guān) 閉 連 接。 </p>
<p></p>
<p>---- 使 用 說(shuō) 明: </p>
<p></p>
<p>---- 本 程 序 實(shí) 現(xiàn) 了 兩 臺(tái) 計(jì) 算 機(jī) 之 間 的 自 由 通 信。 先 將 編 譯 好 的 程 序 分 別 放 入 兩 臺(tái) 已 聯(lián) 網(wǎng) 的 計(jì) 算 機(jī) 的| 開(kāi) 始| 啟 動(dòng)| 中, 這 樣 每 次 啟 動(dòng) 時(shí), 程 序 將 會(huì) 自 動(dòng) 運(yùn) 行, 程 序 啟 動(dòng) 時(shí) 將 以 最 小 化 的 形 式 出 現(xiàn) 在 任 務(wù) 欄 中, 當(dāng) 用 戶(hù) 使 用 時(shí) 可 以 通 過(guò) 點(diǎn) 擊 任 務(wù) 欄 上 的 該 程 序 圖 標(biāo) 來(lái) 激 活 該 程 序, 一 方 將 程 序 激 活 后, 在“ 請(qǐng) 輸 入 所 要 連 接 的 主 機(jī) 名:“ 右 側(cè) 的 編 輯 框 中 輸 入 需 要 連 接 的 計(jì) 算 機(jī) 名, 并 敲“ 連 接” 鍵 便 可 連 接 成 功。 此 時(shí) 在“ 接 收 窗 口:” 下 的 編 輯 框 中 將 會(huì) 出 現(xiàn)“ 連 接 成 功” 的 提 示。 然 后 就 可 以 在“ 發(fā) 送 窗 口:” 下 的 編 輯 框 中 輸 入 要 說(shuō) 的 話 了, 輸 入 完 畢 后 敲“ 發(fā) 送” 鍵 后 便 可 使 另 一 方 收 到 你 的 話 了, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 另 一 方 程 序 將 發(fā) 出 提 示 音 并 使 任 務(wù) 欄 中 程 序 的 圖 標(biāo) 閃 爍, 直 到 另 一 方 將 程 序 激 活 為 正 常 化 并 與 你 對(duì) 話 為 止。 如 果 暫 時(shí) 停 止 對(duì) 話 可 以 點(diǎn) 擊 該 程 序 的 極 小 化 按 鈕 將 程 序 最 小 化, 一 旦 需 要 再 次 通 話 可 直 接 激 活 該 程 序 發(fā) 送 過(guò) 去, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 程 序 仍 將 發(fā) 出 提 示 音 并 使 開(kāi) 使 欄 中 程 序 的 小 圖 標(biāo) 閃 爍, 直 到 另 一 方 將 程 序 正 常 化 并 與 你 對(duì) 話 為 止。 所 以, 無(wú) 論 什 么 時(shí) 候 想 與 對(duì) 方 通 話 只 要 對(duì) 方 開(kāi) 了 機(jī) 便 可 以 實(shí) 現(xiàn)。 當(dāng) 需 要 斷 開(kāi) 連 接 時(shí) 請(qǐng) 按“ 關(guān) 閉” 鍵, 該 程 序 能 自 動(dòng) 發(fā) 送 結(jié) 束 消 息, 使 對(duì) 方 能 夠 知 道 你 已 斷 開(kāi) 連 接, 以 結(jié) 束 程 序 運(yùn) 行。 </p>
<p></p>
<p>---- FORM 的 構(gòu) 造 如 下: </p>
<p></p>
<p>---- Timer 控 件----MMXControl 控 件 ----Gettest 控 件 </p>
<p></p>
<p>---- Winsock 控 件----CommandButton 控 件----Test 控 件 </p>
<p></p>
<p>---- 一 段 的 源 程 序 如 下: </p>
<p></p>
<p>Dim sign As Boolean</p>
<p>Dim flashsign As Boolean</p>
<p>Dim con As Boolean</p>
<p></p>
<p>Private Sub transfer_Click()</p>
<p>On Error GoTo transfererror</p>
<p>Timer1.Enabled = False</p>
<p>gettext.Text = " 陳 濤 說(shuō):" + sendtext.Text + Chr(13) + Chr(10) + gettext.Text</p>
<p>Dim say As String</p>
<p>If sign = True Then</p>
<p>say = " 陳 濤 說(shuō):" + sendtext.Text + Chr(13) + Chr(10)</p>
<p>Winsockout.SendData say</p>
<p>Else</p>
<p>say = " 陳 濤 說(shuō):" + sendtext.Text + Chr(13) + Chr(10)</p>
<p>Winsock1.SendData say</p>
<p>End If</p>
<p>sendtext.Text = ""</p>
<p>Exit Sub</p>
<p>transfererror:</p>
<p> Dim a As String</p>
<p>a = " 計(jì) 算 機(jī) 還 沒(méi) 有 進(jìn) 入 網(wǎng) 絡(luò) 或 者 </p>
<p>是 它 的 相 應(yīng) 程 序 沒(méi) 有 運(yùn) 行 !"</p>
<p> MsgBox (a)</p>
<p> End</p>
<p>Exit Sub</p>
<p>End Sub</p>
<p>Private Sub conbut_Click()</p>
<p>On Error GoTo connecterror</p>
<p>Winsockout.RemoteHost = hostnametext.Text</p>
<p>Winsockout.Connect</p>
<p>sign = True</p>
<p>conbut.Default = False</p>
<p>transfer.Default = True</p>
<p>Exit Sub</p>
<p>connecterror:</p>
<p> Dim a As String</p>
<p>a = " 計(jì) 算 機(jī) 還 沒(méi) 有 進(jìn) 入 網(wǎng) 絡(luò) 或 者 是 </p>
<p>它 的 相 應(yīng) 程 序 沒(méi) 有 運(yùn) 行 !"</p>
<p> Dim b As String</p>
<p> b = " 要 連 接 的 機(jī) 器 名 輸 入 錯(cuò) 誤,"</p>
<p> MsgBox (b + a)</p>
<p> End</p>
<p>Exit Sub</p>
<p>End Sub</p>
<p></p>
<p>Private Sub exitbut_Click()</p>
<p>On Error GoTo exiterror</p>
<p>If con = True Then</p>
<p>End</p>
<p>End If</p>
<p>If sign = True Then</p>
<p>Winsockout.SendData " 中 斷 聯(lián) 接!"</p>
<p>Else</p>
<p>Winsock1.SendData " 中 斷 聯(lián) 接!"</p>
<p>End If</p>
<p>Exit Sub</p>
<p>exiterror:</p>
<p> Dim a As String</p>
<p>a = " 計(jì) 算 機(jī) 還 沒(méi) 有 進(jìn) 入 網(wǎng) 絡(luò) 或 者 是</p>
<p> 它 的 相 應(yīng) 程 序 沒(méi) 有 運(yùn) 行 !"</p>
<p> MsgBox (a)</p>
<p> End</p>
<p>Exit Sub</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Form_Load()</p>
<p>Winsock1.Listen</p>
<p>sign = False</p>
<p>flashsign = True</p>
<p>Timer1.Enabled = False</p>
<p>con = False</p>
<p>conbut.Default = True</p>
<p>End Sub</p>
<p></p>
<p></p>
<p>Private Sub hostnametext_Change()</p>
<p>conbut.Enabled = True</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Timer1_Timer()</p>
<p>If Form1.WindowState = 1 Then</p>
<p>If flashsign = True Then</p>
<p>Form1.Icon = LoadPicture(App.Path + "\zhcn010.ico")</p>
<p>flashsign = False</p>
<p>ElseIf flashsign = False Then</p>
<p>Form1.Icon = LoadPicture(App.Path + "\zhcn020.ico")</p>
<p>flashsign = True</p>
<p>End If</p>
<p>End If</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Winsock1_Close()</p>
<p>conbut.Enabled = True</p>
<p>hostnametext.Enabled = True</p>
<p>Winsock1.Close</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)</p>
<p>If Winsock1.State <> 0 Then</p>
<p>Winsock1.Close</p>
<p>End If</p>
<p>transfer.Default = True</p>
<p>If Form1.WindowState = 1 Then</p>
<p>Timer1.Enabled = True</p>
<p>MMControl1.Notify = False</p>
<p>Form1.MMControl1.Wait = True</p>
<p>Form1.MMControl1.Shareable = False</p>
<p>Form1.MMControl1.DeviceType = "waveaudio"</p>
<p>Form1.MMControl1.filename = App.Path + "\mcitest.wav"</p>
<p>Form1.MMControl1.Command = "Open"</p>
<p>Form1.MMControl1.Command = "play"</p>
<p>Form1.MMControl1.Command = "prev"</p>
<p>End If</p>
<p>conbut.Enabled = False</p>
<p>hostnametext.Enabled = False</p>
<p>sendtext.Enabled = True</p>
<p>gettext.Enabled = True</p>
<p>gettext.Text = " 連 接 成 功!" + Chr(13) + Chr(10)</p>
<p>sign = False</p>
<p>Winsock1.Accept requestID</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)</p>
<p>Dim str As String</p>
<p>If Form1.WindowState = 1 Then</p>
<p>Timer1.Enabled = True</p>
<p>MMControl1.Notify = False</p>
<p>Form1.MMControl1.Wait = True</p>
<p>Form1.MMControl1.Shareable = False</p>
<p>Form1.MMControl1.DeviceType = "waveaudio"</p>
<p>Form1.MMControl1.filename = App.Path + "\mcitest.wav"</p>
<p>Form1.MMControl1.Command = "Open"</p>
<p>Form1.MMControl1.Command = "play"</p>
<p>Form1.MMControl1.Command = "prev"</p>
<p>End If</p>
<p>Winsock1.GetData str</p>
<p>If str = " 中 斷 聯(lián) 接!" Then</p>
<p>con = True</p>
<p>Winsock1.SendData " 可 以 中 斷 聯(lián) 接!"</p>
<p>ElseIf str = " 可 以 中 斷 聯(lián) 接!" Then</p>
<p>End</p>
<p>End If</p>
<p>gettext.Text = str + gettext.Text</p>
<p>End Sub</p>
<p>Private Sub Winsockout_Close()</p>
<p>hostnametext.Enabled = True</p>
<p>Winsockout.Close</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Winsockout_Connect()</p>
<p>Form1.WindowState = 0</p>
<p>gettext.Enabled = True</p>
<p>sendtext.Enabled = True</p>
<p>conbut.Enabled = False</p>
<p>gettext.Text = " 連 接 成 功!" + Chr(13) + Chr(10)</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Winsockout_DataArrival(ByVal bytesTotal As Long)</p>
<p>Dim tempstr As String</p>
<p>If Form1.WindowState = 1 Then</p>
<p>Timer1.Enabled = True</p>
<p>MMControl1.Notify = False</p>
<p>Form1.MMControl1.Wait = True</p>
<p>Form1.MMControl1.Shareable = False</p>
<p>Form1.MMControl1.DeviceType = "waveaudio"</p>
<p>Form1.MMControl1.filename = App.Path + "\mcitest.wav"</p>
<p>Form1.MMControl1.Command = "Open"</p>
<p>Form1.MMControl1.Command = "play"</p>
<p>Form1.MMControl1.Command = "prev"</p>
<p>End If</p>
<p>Winsockout.GetData tempstr</p>
<p>If tempstr = " 中 斷 聯(lián) 接!" Then</p>
<p>con = True</p>
<p>Winsockout.SendData " 可 以 中 斷 聯(lián) 接!"</p>
<p>ElseIf tempstr = " 可 以 中 斷 聯(lián) 接!" Then</p>
<p>End</p>
<p>End If</p>
<p>gettext.Text = tempstr + gettext.Text</p>
<p>End Sub</p>
<p></p>
<p></p>
<p>---- 說(shuō) 明: </p>
<p></p>
<p>---- 在 以 上 程 序 中, 包 括 兩 個(gè)Winsock 控 件 一 個(gè) 是 服 務(wù) 器 端 的, 另 一 個(gè) 是 客 戶(hù) 端 的, 以 此 來(lái) 實(shí) 現(xiàn) 相 互 通 信 的 目 的。 現(xiàn) 將 程 序 中 的 重 要 部 件 的 主 要 屬 性 列 表 如 下( 以 下 的 各 表 格 的 起 頭 均 為 控 件 的Name 屬 性): </p>
<p></p>
<p>Form1 </p>
<p>MaxButton</p>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -