利用Winsock控制項實現區域網通訊 二

2021-04-17 08:52:29 字數 4343 閱讀 7738

如果只有兩台計算機,那十分容易。假設甲機為客戶機,乙機為伺服器,且其ip為192.192.192.1,接收埠為1200(任意選乙個未被使用的埠即可)。首先在甲機客戶端程式中加入乙個winsock控制項,起名為sckconnect,並設定其屬性:remotehost=「192.192.192.1」,(即甲機ip位址), remoteport=1200(即甲機偵聽埠);再在乙機伺服器程式中假如乙個名為sckserver(0)的winsock控制項,其localport=1200,

在乙機伺服器程式中form_load()加入

sckserver(0).bind sckserver(0).localport '與本地埠繫結

sckserver(0).listern ' 偵聽

如果要傳輸資料,兩機必須先建立連線。建立連線的程式如下:

甲機客戶機要先請求連線

sckconnect.connect sckconnect.remotehost, sckconnect.remoteport

此句執行時會觸發伺服器程式中的connectrequest事件,在此過程中決定是否建立連線,其**如下:

private sub sckserver_connectionrequest(index as integer,byval requestid as long)

if sckserver.count=1 then

load sckserver(1)

sckserver(1).accept requestid

end if

end sub

連線建立好以後,甲機或乙機都可以應用senddata方法來傳送資料。例如,如果是甲機要傳送乙個叫string的字串,只需在**中加入:

sckconnect.senddata string

甲機傳送資料後,會觸發乙機的dataarrival事件,在其過程中用getdata方法可以收到傳送的資料:

private sub sckserver_dataarrival(index as integer,byval bytestotal as long)

dim sdata as string

sckserver(1).getdata sdata,vbstring

end sub

最後別忘了在關閉程式前要先關閉winsock控制項

privat sub form_unload(cancel as integer)

if sckconnect.state <>sckclosed then

sckconnect.close

end if

end sub

這只是最簡單的情況,如果有多台計算機,那就稍微複雜一些,客戶端程式可以不做改動,而伺服器端程式需要略做改動:

private sub sckserver_connectrequest(index as integer,byval requestid as long)

dim sip as string

dim i as integer

sip=sckserver(0).remotehostip '獲得登入者的ip位址

i=1

do while i<=sckserver.ubound '檢查是否已經有該位址的記錄

if sckserver(i).remotehostip=sip then '如有,不必載入新的控制項

sckserver(i).accept requestid

exit sub

end if

i=i+1

loop

load sckserver(i) '否則,載入新的控制項

scksrver(i).accept requestid

end sub

注意到:以上的資訊交談實際上都發生在客戶機與伺服器之間,如果要做成聊天室那樣,每個人的話都可以被別人「聽到」,那就要在伺服器端的dataarrival事件中,把接收到的客戶機傳來的資料,**給所有客戶機即可。

其迴圈**資訊的**如下:

for i=1 to sckserver.count

if sckserver(i).state<>sckclosed then

sckserver(i).senddata sdata

end if

next i

怎麼樣,這樣我們就作好了自己的通訊軟體!

不過,不知大家注意到沒有,上述程式都需要有一台計算機做為伺服器,但如果我們的區域網中沒有哪台計算機是可以常開的,也就是說,如果伺服器端程式沒有執行的話,其他客戶端程式也沒有辦法通訊。而這種情況卻可能是經常出現的!至少,我所用的區域網那就是這樣的。難道這樣我們就無法享受區域網通訊的樂趣了嗎?

不要急,記得嗎,我們的winsock控制項還有另乙個主角:udp協議。

udp協議也稱為使用者資料報文協議,是乙個無連線協議。何謂無連線協議?就是說利用此協議連線時,不必象tcp協議那樣:需要伺服器端偵聽,客戶機端請求連線,伺服器端建立連線後雙方才能通訊。另外,udp應用程式可以是客戶機,也可以是伺服器程式,而不必向tcp應用程式那樣必須分別建立客戶機程式和伺服器程式。

下面,來簡述一下udp協議通訊的過程:udp協議中,為了在甲乙兩機中傳輸資料,必須先分別設定兩機的localport屬性;再將甲機的remotehost屬性設定為乙機的ip位址,remoteport屬性設定為乙機的localport屬性值,此時甲機呼叫senddata方法就可以傳送資料了,乙機同樣使用dataarrival事件中的getdata方法來獲取甲機傳送給乙機的資訊。如想乙機向甲機傳送資料,只需仿照上面的過程設定即可。

用udp協議來傳輸資訊較tcp協議來說簡單的多,它無須偵聽(listen),也無須請求連線(connect),就象我們平時發信一樣,只要寫好位址及收信人姓名並傳送出去即可。我們可以藉此來編寫乙個區域網中的資訊傳送程式,下面來簡單介紹以下程式中想實現的功能及其基本思想:

首先,我們一定想讓程式的圖示顯示在system tray中而不顯示在工作列中吧!這要是自己程式設計實現可不是太容易,幸好vb光碟中在common oolsvbunsupportsystemtray 中有乙個現成的程式,我們只要把它編譯成systray.ocx 控制項,然後在編寫自己的程式時新增此控制項即可。其使用方法十分簡單,它已經定義好了滑鼠單擊、雙擊等事件,你只需編寫相應的滑鼠事件即可,這裡不再多說。

程式的關鍵是:udp協議在通訊時要知道對方的ip和port,這要如何實現呢?最簡單的方法是建立乙個配置檔案,裡面放置了區域網上每台計算機的名字、ip和port,在程式初始化時讀出所有資訊,在程式中只要知道向誰通訊,讀出其對應的ip和port即可。

好了,乙個區域網通訊的程式的基本模型已經有了,並不複雜吧!大家趕快動手吧,來享受用自己的程式來聊天的樂趣!

不過,要想編寫乙個出色的程式,不光是要有良好的創意與功能,更重要的是程式的相容性與容錯性。本例中,對錯誤處理沒有做詳細的解釋,關於這一點,大家可以在winsock控制項的error事件及其幫助中找到滿意的答案。

另外,還可以從以下幾方面來考慮功能的擴充:如傳送圖形、聲音等多**資訊、區域網互傳檔案(主動傳送)、歷史聯絡歷史、系統日誌、個人上機時間統計等等,而所有的這一切僅僅取決於你的想象力與你的聰明才智!下面,筆者以傳送檔案為例來講一講其功能實現的**。

你可以把本地的檔案(圖形、聲音等可以先存成臨時檔案)以二進位制檔案的方式來開啟它,將其內容全部讀入乙個byte型別的陣列中,本地機**如下:

dim myfile () as byte

dim position as long

open "filename" for binary as #1

position=0

do while not eof(1)

position=positon+1

redim preserve myfile (1 to position)

get #1,,myfile(position)

loop

close #1

再向遠端機傳送這個位元組陣列

sckserver.senddata myfile

遠端機**如下:

private sub sckconnect_dataarrival(byval bytestotal as long)

dim receivefile(1 to bytestotal)as byte

sckconnect.getdata receivefile,vbarray+vbbyte

'告訴winsock控制項收到的是位元組陣列型別的資料

open "c: emp檔名" for binary as #1

for i=1 to bytestotal

put #1,,remotearray(i)

next i

clost #1

end sub

Python pyftpdlib實現區域網檔案互傳

在同乙個區域網的多台電腦,傳遞檔案時可以通過 搭建web伺服器,設定目錄瀏覽的方式快速分享。如果上傳就比較麻煩了,通過qq 微信會產生很多檔案記錄,通過teamviewer太慢,ftp是乙個不錯的選擇。ftp伺服器軟體在日常開發中,基本不會用到。還涉及 macos windows的環境差異,非常麻煩...

Django實現區域網訪問

一.先關閉防火牆 1.centos7 systemctl stop firewalld.service 2.centos6 service iptables stop 3.windows 直接搜尋防火牆,然後全部關閉 二.settings.py設定 1.設定allowed hosts allowed...

socket實現區域網通訊

今天實現了乙個區域網通訊的小例子,上來記錄一下,不成熟,勿拍。這是我本機客戶端 這是我虛擬機器的客戶端。我為他們分配了靜態ip,這樣就可以實現區域網通訊了。注意 中必須把監視執行緒的isbackground屬性設定為false,這樣關閉視窗時才可以同時將此執行緒關閉。預設是true。using sy...