用Winsock編寫(xiě)網(wǎng)絡(luò)通信程序
發(fā)表時(shí)間:2023-04-07 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]文/徐大華 Winsock是Microsoft Windows提供的網(wǎng)絡(luò)編程接口,它提供了基于TCP/IP協(xié)議的接口實(shí)現(xiàn)方法。用戶(hù)不必了解TCP,通過(guò)設(shè)置Winsock控件的屬性并調(diào)用它的方法,就...
文/徐大華
Winsock是Microsoft Windows提供的網(wǎng)絡(luò)編程接口,它提供了基于TCP/IP協(xié)議的接口實(shí)現(xiàn)方法。用戶(hù)不必了解TCP,通過(guò)設(shè)置Winsock控件的屬性并調(diào)用它的方法,就可以與一臺(tái)遠(yuǎn)程計(jì)算機(jī)相連,從而實(shí)現(xiàn)數(shù)據(jù)傳輸。
TCP/IP協(xié)議提供了兩種同其他計(jì)算機(jī)進(jìn)行通信的方式:TCP和UDP方式。具體采用哪種方式,要視以下三種情況而定:
1、如果應(yīng)用程序在收發(fā)數(shù)據(jù)時(shí)需要得到客戶(hù)端或服務(wù)器端的確認(rèn)或應(yīng)答,則使用TCP方式;
2、如果需要發(fā)送的數(shù)據(jù)量特別大則使用TCP方式;
3、數(shù)據(jù)發(fā)送是間歇的,或是在一個(gè)會(huì)話(huà)內(nèi)?如果發(fā)送通知一類(lèi)的短信息,UDP方式是最適合的。
關(guān)于Winsock控件
Winsock控件在使用前需先在工具箱面板中單擊鼠標(biāo)右鍵,從彈出的菜單中選擇“部件”菜單,從“部件”對(duì)話(huà)框中選擇Microsoft Winsock Controls 6.0,將它添加到工具箱中。在使用Winsock控件前必須先了解它的基本屬性和方法:
1、Protocol:用于設(shè)置和返回Winsock控件所使用的協(xié)議;
2、LocalPort:設(shè)置或返回本地通信程序端;
3、RemotePort:設(shè)置或返回要連接的遠(yuǎn)程計(jì)算機(jī)通信程序的端口號(hào);
4、RemoteHost:設(shè)置或返回遠(yuǎn)程計(jì)算機(jī)名,并向它發(fā)送數(shù)據(jù)或從那里接收數(shù)據(jù);
5、State:返回控件的當(dāng)前狀態(tài)。通過(guò)它的值決定控件的下一步處理狀態(tài);
6、Listen:用于服務(wù)器程序,等待客戶(hù)訪(fǎng)問(wèn)。僅適用于TCP方式;
7、Accept:用于接收連接請(qǐng)求,適用于TCP服務(wù)器應(yīng)用程序,當(dāng)有連接請(qǐng)求時(shí)用此方法接受請(qǐng)求以建立連接;
8、SendData:用于將數(shù)據(jù)發(fā)送給遠(yuǎn)程計(jì)算機(jī)?稍赥CP/UDP兩種方式下使用;
9、GetData:用來(lái)取得接收到的數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在變體類(lèi)型的變量中,然后清除接收緩沖區(qū);
10、Close:對(duì)客戶(hù)機(jī)和服務(wù)器應(yīng)用程序關(guān)閉TCP連接。
實(shí)例制作
本例是通過(guò)Winsock控件的遠(yuǎn)程通訊功能,采用TCP協(xié)議來(lái)設(shè)計(jì)一師生聊天程序。
1、教師機(jī)即服務(wù)器
在這里需要兩個(gè)Label控件和一個(gè)Winsock控件。
對(duì)于Winsock的端口號(hào)(LocalPort),通常選擇大于100的整數(shù),以避免同其他通信程序產(chǎn)生沖突。該程序通過(guò)Text1的Change事件,向客戶(hù)端的Text2發(fā)送數(shù)據(jù)。
程序代碼如下:
Private Sub Form_Load()
Winsock1.LocalPort = 1001 '設(shè)置本地計(jì)算機(jī)通信程序端口
Winsock1.Listen '等待客戶(hù)機(jī)訪(fǎng)問(wèn)
Form2.Show '顯示客戶(hù)機(jī)界面
End Sub
Private Sub Text1_Change()
Winsock1.SendData Text1.Text '將數(shù)據(jù)傳輸給客戶(hù)機(jī)
End Sub
Private Sub Winsock1_ConnectionRequ-
est(ByVal requestID As Long)
If Winsock1.State<>sckClosed Then
Winsock1.Close
Winsock1.Accept requested '用于接收連接請(qǐng)求
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aa As String
Winsock1.GetData aa '接收客戶(hù)機(jī)傳輸過(guò)來(lái)的數(shù)據(jù)
Text2.Text = aa '將客戶(hù)機(jī)傳輸過(guò)來(lái)的數(shù)據(jù)顯示在Text2中
End Sub
2、學(xué)生機(jī)即客戶(hù)機(jī)
在這里需要的兩個(gè)Label控件、兩個(gè)Command控件以及一個(gè)Winsock控件。
程序代碼如下:
Private Sub Command1_Click()
Form2.Winsock1.Connect '同遠(yuǎn)程計(jì)算機(jī)建立連接
End Sub
Private Sub Command3_Click()
End '結(jié)束程序運(yùn)行
End Sub
Private Sub Form_Load()
Winsock1.RemoteHost = "遠(yuǎn)程計(jì)算機(jī)名"
'獲取遠(yuǎn)程計(jì)算機(jī)名
Winsock1.RemotePort = 1001 '獲取遠(yuǎn)程計(jì)算機(jī)通信程序的端口
End Sub
Private Sub Text1_Change()
Winsock1.SendData Text1.Text '向服務(wù)器發(fā)送數(shù)據(jù)
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aa As String
Winsock1.GetData aa '接收服務(wù)器傳輸入過(guò)來(lái)的數(shù)據(jù)
Text2.Text = aa '將接收的數(shù)據(jù)在Text2中顯示出來(lái)
End Sub
運(yùn)行服務(wù)器程序,再運(yùn)行客戶(hù)端程序,最后單擊客戶(hù)端窗全上的“連接”按鈕,這時(shí)就可實(shí)現(xiàn)兩個(gè)計(jì)算機(jī)間的通信了。