?? 83.htm
字號:
<p>用VB 創 建 自 己 的 通 信 程 序 </p>
<p></p>
<p> </p>
<p>Winsock 控 件 建 立 在TCP、UDP 的 協 議 基 礎 上, 以 完 成 計 算 機 網 絡 間 的 通 信。 下 面 將 詳 細 的 介 紹 具 體 的 程 序 創 建 過 程, 以 便 使 大 家 更 好 的 理 解 程 序 的 源 代 碼。 </p>
<p></p>
<p>---- 服 務 器 端 程 序 的 運 行 過 程 是: </p>
<p></p>
<p>---- (4) 服 務 器 端 要 設 置 好 偵 聽 端 口 即LocalPort 屬 性, 作 為 偵 聽 端 口 的 值 必 須 是 一 個 整 數( 一 定 要 是 其 它TCP/IP 應 用 程 序 沒 有 用 過 的 值, 并 且 不 能 與 系 統 缺 省 端 口 沖 突)。 </p>
<p></p>
<p>---- (5) 用Listen 方 法 進 入 偵 聽 狀 態, 等 待 客 戶 機 的 連 接 請 求。 </p>
<p></p>
<p>---- (6) 當 客 戶 機 發 出 連 接 請 求 時, 使 服 務 器 產 生 一 個ConnectionRequest 事 件, 且 該 事 件 得 到 一 個 參 數requestID。 </p>
<p></p>
<p>---- (7) 服 務 器 程 序 用Accept 方 法 接 受 客 戶 機requestID 請 求。 這 樣, 服 務 器 程 序 便 可 以 用SendData 方 法 來 發 送 數 據 了。 但 是,Accept 方 法 必 須 用 上 一 個 步 得 到 的requestID 作 為 其 參 數。 </p>
<p></p>
<p>---- (8) 當 服 務 器 程 序 接 收 到 數 據 時, 便 會 產 生 一 個DataArrial 事 件, 參 數BytesTotal 包 含 接 收 到 的 數 據 字 節 數。 在 該 事 件 中, 可 以 用GetData 方 法 接 收 數 據。 </p>
<p></p>
<p>---- (9) 如 果 接 收 到Close 事 件, 則 用Close 方 法 關 閉TCP/IP 連 接。 </p>
<p></p>
<p>---- 客 戶 機 的 程 序 的 運 行 過 程 是: </p>
<p></p>
<p>---- (8) 在 客 戶 程 序 中 設 置Remmotehost 屬 性, 以 便 指 定 運 行 服 務 器 程 序 的 主 機 名, 該 字 符 串 可 以 在 服 務 器“ 控 制 面 板| 網 絡| 標 識| 計 算 機” 中 查 到。 </p>
<p></p>
<p>---- (9) 設 置RemotePort 屬 性, 以 便 指 定 服 務 器 程 序 的 偵 聽 端 口( 其 設 置 方 法 與 服 務 器 端 類 似)。 </p>
<p></p>
<p>---- (10) 使 用Connect 方 法, 向 服 務 器 提 出 連 接 請 求。 </p>
<p></p>
<p>---- (11) 當 服 務 器 程 序 接 受 到 客 戶 機 程 序 的 請 求 后, 客 戶 機 程 序 產 生Connect 事 件, 就 可 以 用SendData 方 法 發 送 數 據 了。 </p>
<p></p>
<p>---- (12) 當 客 戶 機 程 序 接 收 到 數 據 時, 便 會 產 生DataArrival 事 件, 參 數BytesTotal 包 含 接 收 到 的 數 據 字 節 數。 類 似 的 在 該 事 件 中 也 可 以 用GetData 方 法 接 收 數 據。 </p>
<p></p>
<p>---- (13) 如 果 客 戶 機 程 序 接 收 到Close, 則 用Close 方 法 關 閉 連 接。 </p>
<p></p>
<p>---- 使 用 說 明: </p>
<p></p>
<p>---- 本 程 序 實 現 了 兩 臺 計 算 機 之 間 的 自 由 通 信。 先 將 編 譯 好 的 程 序 分 別 放 入 兩 臺 已 聯 網 的 計 算 機 的| 開 始| 啟 動| 中, 這 樣 每 次 啟 動 時, 程 序 將 會 自 動 運 行, 程 序 啟 動 時 將 以 最 小 化 的 形 式 出 現 在 任 務 欄 中, 當 用 戶 使 用 時 可 以 通 過 點 擊 任 務 欄 上 的 該 程 序 圖 標 來 激 活 該 程 序, 一 方 將 程 序 激 活 后, 在“ 請 輸 入 所 要 連 接 的 主 機 名:“ 右 側 的 編 輯 框 中 輸 入 需 要 連 接 的 計 算 機 名, 并 敲“ 連 接” 鍵 便 可 連 接 成 功。 此 時 在“ 接 收 窗 口:” 下 的 編 輯 框 中 將 會 出 現“ 連 接 成 功” 的 提 示。 然 后 就 可 以 在“ 發 送 窗 口:” 下 的 編 輯 框 中 輸 入 要 說 的 話 了, 輸 入 完 畢 后 敲“ 發 送” 鍵 后 便 可 使 另 一 方 收 到 你 的 話 了, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 另 一 方 程 序 將 發 出 提 示 音 并 使 任 務 欄 中 程 序 的 圖 標 閃 爍, 直 到 另 一 方 將 程 序 激 活 為 正 常 化 并 與 你 對 話 為 止。 如 果 暫 時 停 止 對 話 可 以 點 擊 該 程 序 的 極 小 化 按 鈕 將 程 序 最 小 化, 一 旦 需 要 再 次 通 話 可 直 接 激 活 該 程 序 發 送 過 去, 如 果 另 一 方 的 程 序 尚 未 正 常 化, 那 么 程 序 仍 將 發 出 提 示 音 并 使 開 使 欄 中 程 序 的 小 圖 標 閃 爍, 直 到 另 一 方 將 程 序 正 常 化 并 與 你 對 話 為 止。 所 以, 無 論 什 么 時 候 想 與 對 方 通 話 只 要 對 方 開 了 機 便 可 以 實 現。 當 需 要 斷 開 連 接 時 請 按“ 關 閉” 鍵, 該 程 序 能 自 動 發 送 結 束 消 息, 使 對 方 能 夠 知 道 你 已 斷 開 連 接, 以 結 束 程 序 運 行。 </p>
<p></p>
<p>---- FORM 的 構 造 如 下: </p>
<p>---- Timer 控 件----MMXControl 控 件 ----Gettest 控 件 </p>
<p>---- Winsock 控 件----CommandButton 控 件----Test 控 件 </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 = " 陳 濤 說:" + sendtext.Text + Chr(13) + Chr(10) + gettext.Text</p>
<p>Dim say As String</p>
<p>If sign = True Then</p>
<p>say = " 陳 濤 說:" + sendtext.Text + Chr(13) + Chr(10)</p>
<p>Winsockout.SendData say</p>
<p>Else</p>
<p>say = " 陳 濤 說:" + 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 = " 計 算 機 還 沒 有 進 入 網 絡 或 者 </p>
<p>是 它 的 相 應 程 序 沒 有 運 行 !"</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 = " 計 算 機 還 沒 有 進 入 網 絡 或 者 是 </p>
<p>它 的 相 應 程 序 沒 有 運 行 !"</p>
<p>Dim b As String</p>
<p>b = " 要 連 接 的 機 器 名 輸 入 錯 誤,"</p>
<p>MsgBox (b + a)</p>
<p>End</p>
<p>Exit Sub</p>
<p>End Sub</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 " 中 斷 聯 接!"</p>
<p>Else</p>
<p>Winsock1.SendData " 中 斷 聯 接!"</p>
<p>End If</p>
<p>Exit Sub</p>
<p>exiterror:</p>
<p>Dim a As String</p>
<p>a = " 計 算 機 還 沒 有 進 入 網 絡 或 者 是</p>
<p>它 的 相 應 程 序 沒 有 運 行 !"</p>
<p>MsgBox (a)</p>
<p>End</p>
<p>Exit Sub</p>
<p>End Sub</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>Private Sub hostnametext_Change()</p>
<p>conbut.Enabled = True</p>
<p>End Sub</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>Private Sub Winsock1_Close()</p>
<p>conbut.Enabled = True</p>
<p>hostnametext.Enabled = True</p>
<p>Winsock1.Close</p>
<p>End Sub</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>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 = " 中 斷 聯 接!" Then</p>
<p>con = True</p>
<p>Winsock1.SendData " 可 以 中 斷 聯 接!"</p>
<p>ElseIf str = " 可 以 中 斷 聯 接!" 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>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>Private Sub Winsockout_DataAr</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -