顯示具有 socket 標籤的文章。 顯示所有文章
顯示具有 socket 標籤的文章。 顯示所有文章

2011年8月29日 星期一

C/S 與 B/S 區別

B/S結構,即Browser/Server(瀏覽器/服務器)結構,是隨著Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,用戶界面完全通過WWW瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在服務器端實現,形成所謂3-tier結構。B/S結構,主要是利用了不斷成熟的WWW瀏覽器技術,結合瀏覽器的多種scrīpt語言(VBscrīpt、Javascrīpt…)和ActiveX技術,用通用瀏覽器就實現了原來需要複雜專用軟件才能實現的強大功能,並節約了開發成本,是一種全新的軟件系統構造技術。隨著Windows98/Windows 2000將瀏覽器技術植入操作系統內部,這種結構更成為當今應用軟件的首選體系結構。顯然B/S結構應用程序相對於傳統的C/S結構應用程序將是巨大的進步。

C/S 與 B/S 區別:
  Client/Server一般是建立在局域網的基礎上的.Browser/Server是建立在廣域網的基礎上的.
1.硬件環境不同:
  C/S 一般建立在專用的網絡上, 小範圍裡的網絡環境, 局域網之間再通過專門服務器提供連接和數據交換服務.
  B/S 建立在廣域網之上的, 不必是專門的網絡硬件環境,例與電話上網, 租用設備. 信息自己管理. 有比C/S更強的適應範圍, 一般只要有操作系統和瀏覽器就行
2.對安全要求不同
  C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強. 一般高度機密的信息系統採用C/S 結構適宜. 可以通過B/S發佈部分可公開信息.
  B/S 建立在廣域網之上, 對安全的控制能力相對弱, 面向是不可知的用戶群.
3.對程序架構不同
  C/S 程序可以更加注重流程, 可以對權限多層次校驗, 對系統運行速度可以較少考慮.
  B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟.
4.軟件重用不同
  C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好.
  B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在牆上的石頭桌子
5.系統維護不同
系統維護是軟件生存週期中,開銷大, -------重要
  C/S 程序由於整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 可能是再做一個全新的系統
  B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升級.
6.處理問題不同
  C/S 程序可以處理用戶面固定, 並且在相同區域, 安全要求高需求, 與操作系統相關. 應該都是相同的系統
  B/S 建立在廣域網上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的. 與操作系統平台關係最小.
7.用戶接口不同
  C/S 多是建立的Window平台上,表現方法有限,對程序員普遍要求較高
  B/S 建立在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 並且大部分難度減低,減低開發成本.
8.信息流不同
  C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低
  B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心  

比如一些聊天軟件,是c/s結構的因為滿足這種軟件的可維護和升級性,滿足不同的人群的個性和喜好,自己制定自己的界面,安裝自己喜歡的插件,但在b/s結構上實現這一點比較困難,並且可擴展性也不好。

比如說很多人每天上新浪網,只要安裝了瀏覽器就可以了,並不需要瞭解新浪的服務器用的是什麼操作系統,而事實上大部分網站確實沒有使用windows操作系統,但用戶的電腦本身安裝的大部分是windows操作系統
軟件系統的改進和升級越來越頻繁,B/S架構的產品明顯體現的更方便的特性。無論用戶的規模有多大,有多少分支機構都不會增加任何維護升級的工作量,所有的操作只需要針對服務器進行,如果是異地只需要把服務器連接上網即可立即進行維護和升級,這對人力、時間、費用的節省是相當驚人的。
一個稍微大一點單位來說,系統管理人員如果需要在幾百甚至幾千部電腦之間來回奔跑,效率和工作量是可想而知的,但B/S架構的軟件只需要管理服務器就行了,所有的客戶端只是瀏覽器,根本不需要做任何的維護。所以客戶機越來越"瘦"而服務器越來越"胖"是將來軟件的主流發展方向,這使得升級和維護越來越容易而使用越來越簡單。

2010年12月7日 星期二

微軟:非同步伺服器通訊端範例

非同步伺服器通訊端範例

VB.net檔案傳輸

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Net.Sockets
Imports System.Text.Encoding
Public Module FileTransfer
Private Const BufferSize As Integer = 16384
Private Const Port As Integer = 2070
'''
''' 捕獲外來訊息的伺服器類別
'''

'''
Public Class FileServer
Public Shared Mainform As Form1
Public Port As Integer = FileTransfer.Port
Private ServerSocket As Socket
Public Sub New(ByRef form As Form)
Mainform = form
ServerSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim ipen As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
Dim endpoint = New IPEndPoint(IPAddress.Any, Port)
ServerSocket.Bind(endpoint)
ServerSocket.Listen(1000)
ServerSocket.BeginAccept(AddressOf CatchSocket, ServerSocket)
End Sub
'捕捉新連線
Public Sub CatchSocket(ByVal result As IAsyncResult)
'重新導向到轉接器
Dim TIO As New TempInterObject(ServerSocket.EndAccept(result))
TIO.Sock.ReceiveBufferSize = BufferSize
'開始處理基本傳輸資料
TIO.Sock.BeginReceive(TIO.Buffer, 0, TIO.Buffer.Length, 0, AddressOf InfoWorker, TIO)
ServerSocket.BeginAccept(AddressOf CatchSocket, ServerSocket)
End Sub
'處理開頭資料
Public Sub InfoWorker(ByVal result As IAsyncResult)
Dim TIO As TempInterObject = CType(result.AsyncState, TempInterObject)
Dim len As Integer = TIO.Sock.EndReceive(result)
Dim Src As String = UTF8.GetString(TIO.Buffer, 0, len)
Dim Command As String = Src.Substring(0, Src.IndexOf(" "))
Dim File As String = Src.Substring(Src.IndexOf(" ") + 1)
Dim nTask As TransferTask
If Command = "GET" Then '對方要求檔案
nTask = New TransferTask(File, TIO.Sock, TransferTask.Method.SEND) '發送檔案資訊->傳輸檔案
Else '對方要求傳送檔案給本機
Dim Sign(0) As Byte
Sign(0) = IIf(My.Computer.FileSystem.FileExists(File), 0, 1) '如果檔案存在則不允許
TIO.Sock.Send(Sign, 1, SocketFlags.None) '傳送准許憑證
nTask = New TransferTask(File, TIO.Sock, TransferTask.Method.GET) '開始下載
nTask.FileSize = Val(Command.Substring(Command.IndexOf("[") + 1, Command.IndexOf("]") - Command.IndexOf("["))) '分析檔案大小
End If
End Sub
End Class
'''
''' 轉接Socket用的暫時類別
'''

'''
Public Class TempInterObject
Public Buffer(BufferSize - 1) As Byte
Public Sock As Socket
Public Sub New(ByVal SocketObject As Socket)
Me.Sock = SocketObject
End Sub
End Class
'''
''' 傳送檔案 控制類別("下載工作"物件)
'''

'''
Public Class TransferTask
Public Enum Method
[GET] = 0
[SEND] = 1
End Enum
Public FilePath As String = ""
Public Host As String = "", Port As Integer = FileTransfer.Port
Private Data(BufferSize - 1) As Byte
Private Reader As IO.FileStream
Private Sock As Socket
Private WriteStream As IO.FileStream
Protected Friend FileSize As UInteger = 0
Private ReadSize As UInteger = 0
Private LastProgress As Integer = 0
Private mType As Method = 0
Private Delegate Sub InvokeFinished(ByVal [Error] As Boolean)
Private FinishedInvoker As New InvokeFinished(AddressOf onProgressFinished)
'接收檔案(主動)
Private Sub GetNew(ByVal File As String, ByVal LocalFile As String, ByVal Host As String)
Sock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Sock.Connect(Host, Port)
FilePath = LocalFile
Sock.SendBufferSize = BufferSize
SendString("GET " & File)
Sock.BeginReceive(Data, 0, Data.Length, SocketFlags.None, AddressOf GetSize, Me)
End Sub
'傳送檔案(主動)
Private Sub SendNew(ByVal File As String, ByVal RemoteFile As String, ByVal Host As String)
Sock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Sock.Connect(Host, Port)
FilePath = File
Sock.SendBufferSize = BufferSize
FileSize = GetFileSize(File)
SendString("SEND[" & FileSize & "] " & RemoteFile)
'偵測憑證
Sock.BeginReceive(Data, 0, 1, SocketFlags.None, AddressOf Accepted, Me)
End Sub
'傳送或接收檔案(主動)
Public Sub New(ByVal FileA As String, ByVal FileB As String, ByVal Host As String, ByVal Type As Method, Optional ByVal Port As Integer = 2070)
mType = Type
Me.Host = Host
Me.Port = Port
If Type = Method.GET Then GetNew(FileA, FileB, Host) Else SendNew(FileA, FileB, Host)
End Sub
'傳送或接收檔案(被動)
Public Sub New(ByVal File As String, ByVal Sock As Socket, ByVal Type As Method)
mType = Type
Me.Sock = Sock
FilePath = File
Sock.SendBufferSize = BufferSize
If Type = Method.SEND Then
'傳送檔案
'送出檔案大小
FileSize = GetFileSize(File)
SendString(FileSize)
'偵測憑證
Sock.BeginReceive(Data, 0, 1, SocketFlags.None, AddressOf Accepted, Me)
Else
'接收檔案
Sock.BeginReceive(Data, 0, Data.Length, SocketFlags.None, AddressOf Recived, Me)
End If
End Sub
'對方准許我方傳送
Private Sub Accepted(ByVal Result As IAsyncResult)
Sock.EndReceive(Result)
If Data(0) = 0 Then
onProgressFinished(True)
Sock.Close()
Exit Sub
End If
Reader = New IO.FileStream(FilePath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
If Reader.Length < BufferSize Then
System.Array.Resize(Data, Reader.Length)
End If
Reader.BeginRead(Data, 0, Data.Length, AddressOf FileReaded, Me)
End Sub
'我方接收檔案串流
Private Sub Recived(ByVal result As IAsyncResult)
'讀取
Dim Len As Integer = 0
Try
Len = Sock.EndReceive(result)
Catch : End Try
If Len = 0 Then
Sock.Shutdown(SocketShutdown.Both)
Sock.Close()
If WriteStream IsNot Nothing Then
'下載終了
WriteStream.Close()
WriteStream.Dispose()
End If
onProgressFinished(False)
Exit Sub
End If
If WriteStream Is Nothing Then
WriteStream = New IO.FileStream(FilePath, IO.FileMode.Append)
End If
'修改進度!
ReadSize += Len
onProgressChanged()
WriteStream.Write(Data, 0, Len)
Try
Sock.BeginReceive(Data, 0, Data.Length, SocketFlags.None, AddressOf Recived, Me)
Catch
WriteStream.Close()
WriteStream.Dispose()
onProgressFinished(Not ReadSize = Len)
End Try
End Sub
'取得被動的對方傳送的檔案大小
Private Sub GetSize(ByVal result As IAsyncResult)
Dim Len As Integer = Sock.EndReceive(result)
FileSize = Val(UTF8.GetString(Data, 0, Len))
Dim Sign(0) As Byte
Sock.Send(Sign, 1, SocketFlags.None)
Sock.BeginReceive(Data, 0, Data.Length, SocketFlags.None, AddressOf Recived, Me)
End Sub
'傳送字串
Private Sub SendString(ByVal msg As String)
Dim Buffer() As Byte = System.Text.Encoding.UTF8.GetBytes(msg)
Sock.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, AddressOf StringSended, Sock)
End Sub
'傳送字串的End偵聽函式
Private Sub StringSended(ByVal result As IAsyncResult)
Try : CType(result.AsyncState, Socket).EndSend(result) : Catch : End Try
End Sub
'傳送串流的End偵聽函式
Private Sub StreamSended(ByVal result As IAsyncResult)
Sock.EndSend(result) '結束非同步傳送Stream
If Reader.Length <= Reader.Position Then '如果讀到盡頭
Sock.Close()
Reader.Close()
Reader.Dispose()
onProgressFinished(False)
Exit Sub
End If
If Reader.Length - Reader.Position < BufferSize Then '如果剩下位傳送的位元組不到BufferSize
System.Array.Resize(Data, Reader.Length - Reader.Position)
End If
ReadSize += Data.Length '增加進度
onProgressChanged()
Reader.BeginRead(Data, 0, Data.Length, AddressOf FileReaded, Me)
End Sub
'讀取串流的End偵聽函式
Private Sub FileReaded(ByVal result As IAsyncResult)
Reader.EndRead(result) '結束非同步讀取Stream
Sock.BeginSend(Data, 0, Data.Length, SocketFlags.None, AddressOf StreamSended, Me) '開始傳送資料
End Sub
'進度改變檢測
Private Sub onProgressChanged()
If FileServer.Mainform.InvokeRequired Then
FileServer.Mainform.BeginInvoke(New MethodInvoker(AddressOf onProgressChanged))
Exit Sub
End If
If Int(Progress) - LastProgress > 0 Then
RaiseEvent ProgressChanged(Me, Progress)
End If
LastProgress = Int(Progress)
End Sub
'結束下載
Private Sub onProgressFinished(ByVal [Error] As Boolean)
If FileServer.Mainform.InvokeRequired Then
FileServer.Mainform.BeginInvoke(FinishedInvoker, [Error])
Exit Sub
End If
RaiseEvent ProgressChanged(Me, 100)
RaiseEvent ProgressFinished(Me, [Error])
End Sub
'屬性
Public ReadOnly Property Progress() As Single
Get
If FileSize > 0 Then
Return (ReadSize / FileSize) * 100
Else
Return 0
End If
End Get
End Property
Public ReadOnly Property Length() As UInteger
Get
Return FileSize
End Get
End Property
Public ReadOnly Property Type() As Method
Get
Return mType
End Get
End Property
'''
''' 當下載進度改變時呼叫
'''

''' "下載工作"物件
''' 進度(百分比)
'''
Public Event ProgressChanged(ByVal Sender As TransferTask, ByVal value As Integer)
'''
''' 下載完成時呼叫
'''

''' "下載工作"物件
''' 是否錯誤
'''
Public Event ProgressFinished(ByVal Sender As TransferTask, ByVal [Error] As Boolean)
End Class
'''
''' 取得檔案大小
'''

''' 檔案路徑
''' 檔案大小(位元組)
'''
Public Function GetFileSize(ByVal Path As String) As Integer
Return My.Computer.FileSystem.GetFileInfo(Path).Length
End Function
'''
''' 非同步傳送檔案
'''

''' 本機檔案(被傳送的)
''' 遠端位置(被傳送後要放置的位置)
''' 遠端主機
''' 結束時呼叫
''' 進度更新呼叫
'''
Public Sub BeginTransFile(ByVal Local As String, ByVal Remote As String, ByVal Host As String, Optional ByVal onEnd As TransferTask.ProgressFinishedEventHandler = Nothing, Optional ByVal onChange As TransferTask.ProgressChangedEventHandler = Nothing)
Dim Task As New TransferTask(Local, Remote, Host, TransferTask.Method.SEND)
If onEnd IsNot Nothing Then AddHandler Task.ProgressFinished, onEnd
If onChange IsNot Nothing Then AddHandler Task.ProgressChanged, onChange
End Sub
'''
''' 非同步下載檔案
'''

''' 本機檔案(被傳送後要放置的位置)
''' 遠端位置(被傳送的)
''' 遠端主機
''' 結束時呼叫
''' 進度更新呼叫
'''
Public Sub BeginGetFile(ByVal Remote As String, ByVal Local As String, ByVal Host As String, Optional ByVal onEnd As TransferTask.ProgressFinishedEventHandler = Nothing, Optional ByVal onChange As TransferTask.ProgressChangedEventHandler = Nothing)
Dim Task As New TransferTask(Remote, Local, Host, TransferTask.Method.GET)
If onEnd IsNot Nothing Then AddHandler Task.ProgressFinished, onEnd
If onChange IsNot Nothing Then AddHandler Task.ProgressChanged, onChange
End Sub
End Module

vbnet socket 傳檔+續傳

來源處

---
主機端:
' 宣告儲存二進位檔案通道編號的變數
Dim FileNo As Integer
' 儲存接收檔案的檔案名稱變數
Dim RecvFileName As String

Private Sub Form_Load()
' 初始化各種控制項的相關屬性值
Label2.Caption = "接收位元組"
Label3.Caption = "0"
Me.Caption = "EX1004 主機端"
Timer1.Interval = 100

' 初始化二組Winsock控制項
' Winsock1用來傳送溝通訊息
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 6000
Winsock1.Listen
' Winsock2用來傳送檔案內容
Winsock2.Protocol = sckTCPProtocol
Winsock2.LocalPort = Winsock1.LocalPort + 1
Winsock2.Listen
End Sub

Private Sub Timer1_Timer()
' 判斷Winsock控制項的狀態
Select Case Winsock1.State
Case sckClosed ' 常數值0
Label1.Caption = "已經關閉用戶端連線"
Case sckOpen ' 常數值1
Label1.Caption = "開啟"
Case sckListening ' 常數值2
Label1.Caption = "監聽中..."
Case sckConnectionPending ' 常數值3
Label1.Caption = "尚未連連線"
Case sckResolvingHost ' 常數值4
Label1.Caption = "主機解析中"
Case sckHostResolved ' 常數值5
Label1.Caption = "主機解析完畢"
Case sckConnecting ' 常數值6
Label1.Caption = "連線中..."
Case sckConnected ' 常數值7
Label1.Caption = "已經連線"
Case sckClosing ' 常數值8
Label1.Caption = "正在關閉連線"
' 判斷Winsock控制項的連線狀態
If Winsock1.State <> sckClosed Then
' 關閉Winsock1控制項現有的連線作業
Winsock1.Close
DoEvents
' 將Winsock1控制項設定在監聽模式
Winsock1.Listen
' 關閉Winsock2控制項現有的連線作業
Winsock2.Close
DoEvents
Winsock2.Listen
End If
End Select
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal RequestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close
' 允許遠端設備使用必要的識別碼(RequestID)與主機
' 進行連接。
Winsock1.Accept RequestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sVar As String
Dim OldLength As Long
Dim FileNo1 As Integer
Dim Buffers() As Byte
Winsock1.GetData sVar, vbString
Select Case Mid(sVar, 1, 4)
' 用戶端傳來檔案名稱表示準備傳送檔案,
' 並等候主機端的回應
Case "檔案名稱"
' 檔案名稱文字之後,即為即將接收的檔案名稱
RecvFileName = Mid(sVar, 5)
If Len(Dir$(RecvFileName)) > 0 Then
' 檔案存在
OldLength = FileLen(RecvFileName)
Name App.Path & "\" & RecvFileName As App.Path & "\TEMP.BIN"
DoEvents
End If
' 重新設定顯示接收位元組的Label3控制項
Label3.Caption = "0"
' 取得可用的檔案通道
FileNo = FreeFile
' 以二進位檔案寫入模式,開啟指定的檔案開啟
Open App.Path & "\" & RecvFileName For Binary Access Write As #FileNo
' 依據 OldLength變數的值,判斷是否需要續傳
If OldLength > 0 Then
FileNo1 = FreeFile
' 開啟暫存檔
Open App.Path & "\TEMP.BIN" For Binary Access Read As #FileNo1
' 將暫存檔的內容全數讀入緩衝區位元組陣列
ReDim Buffers(OldLength - 1)
Get #FileNo1, , Buffers
DoEvents
' 將暫存檔的內容寫入即將續傳的檔案中
Put #FileNo, , Buffers
Close #FileNo1
DoEvents
' 刪除暫存檔
Kill App.Path & "\TEMP.BIN"
DoEvents
' 回傳『斷點續傳』訊息 + 已經接收的檔案位元組數量
Winsock1.SendData "斷點續傳" & OldLength
Else
' 回傳主機端已經開啟二進位檔案的寫入模式
Winsock1.SendData "準備就緒"
End If
Case "傳送檔案"
Label1.Caption = "傳送檔案"
Case "傳送完畢"
' 關閉已經開啟的通道
Close #FileNo
FileNo = 0
' 回傳主機端已經接收完畢
Winsock1.SendData "資料接收完畢"
DoEvents
End Select
End Sub

Private Sub Winsock2_ConnectionRequest(ByVal RequestID As Long)
If Winsock2.State <> sckClosed Then Winsock2.Close
' 允許遠端設備使用必要的識別碼(RequestID)與主機
' 進行連接。
Winsock2.Accept RequestID
End Sub

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim sVar() As Byte
' 從 FileNo變數的值,可以判定二進位檔案寫入模式是否已經準備就緒
If FileNo > 0 Then
' 讀取 Winsock2 控制項的接收緩衝區
Winsock2.GetData sVar, vbByte
' 將位元組陣列寫入檔案
Put #FileNo, , sVar
Winsock1.SendData "資料接收中"
' 更新已經接收位元組數量的資訊
Label3.Caption = CLng(Label3.Caption) + UBound(sVar, 1) + 1
End If
End Sub



---
用戶端(用來傳送檔案):
' 宣告用來儲存將要傳送檔案名稱的變數
Dim SendFileName As String

' 按下『連線』按鈕
Private Sub Command1_Click()
' 關閉 Winsock1、Winsock2控制項的目前連線
If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
If Winsock2.State <> scckclosed Then
Winsock2.Close
End If
' 初始化Winsock1控制項和Winsock2控制項
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = Text1.Text
Winsock1.RemotePort = CLng(Text2.Text)
Winsock2.Protocol = sckTCPProtocol
Winsock2.RemoteHost = Text1.Text
Winsock2.RemotePort = CLng(Text2.Text) + 1
' 和主機端連接
Winsock1.Connect
Winsock2.Connect
End Sub

' 按下『離線』按鈕
Private Sub Command2_Click()
Winsock1.Close
Winsock2.Close
End Sub

Private Sub Command3_Click()
' 宣告即將取出檔案名稱的變數
Dim Datas() As String
CommonDialog1.Filter = "所有檔案(*.*)|*.*"
CommonDialog1.InitDir = "C:\"
CommonDialog1.ShowOpen
' 判斷 FileName 屬性值是否空白
If Trim(CommonDialog1.FileName) = "" Then
Exit Sub
End If
' 設定 SendFileName變數的值
SendFileName = CommonDialog1.FileName
' 將 SendFileName變數的值 暫存在 Label3控制項的Tag屬性
Label3.Tag = "『" & SendFileName & "』"
' 取出不含路徑資訊的檔案名稱
Datas = Split(SendFileName, "\")
' 傳送即將傳送的檔案名稱
Winsock1.SendData "檔案名稱" & Datas(UBound(Datas, 1))
DoEvents
End Sub

Private Sub Form_Load()
' 初始化各種控制項的相關屬性
Label1.Caption = "主機位址:"
Label2.Caption = "連接埠編號:"
Label3.Caption = ""
Me.Caption = "EX1004 用戶端"
Command1.Caption = "連線"
Command2.Caption = "離線"
Command3.Caption = "傳送檔案"
Text1.Text = "127.1"
Text2.Text = "6000"
' 啟用 Timer1控制項監視Winsock1控制項的狀態
Timer1.Interval = 100
End Sub

Private Sub Timer1_Timer()
' 判斷Winsock控制項的狀態
Select Case Winsock1.State
Case sckClosed ' 常數值0
Label4.Caption = "尚未連線"
Case sckOpen ' 常數值1
Label4.Caption = "開啟"
Case sckListening ' 常數值2
Label4.Caption = "監聽中..."
Case sckConnectionPending ' 常數值3
Label4.Caption = "尚未連連線"
Case sckResolvingHost ' 常數值4
Label4.Caption = "主機解析中"
Case sckHostResolved ' 常數值5
Label4.Caption = "主機解析完畢"
Case sckConnecting ' 常數值6
Label4.Caption = "連線中..."
Case sckConnected ' 常數值7
Label4.Caption = "已經和主機端連線"
Case sckClosing ' 常數值8
Label4.Caption = "切斷連線中"
End Select
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sVar
Dim TotalBytes As Long ' 取得檔案的位元組數量
Dim Buffers() As Byte ' 緩衝區位元組陣列
Dim I As Long ' 迴圈變數
Dim Mods As Long ' 取得餘數
Dim Quotient As Long ' 取得商
Dim FileNo As Integer ' 儲存檔案通道編號
Dim BreakPoint As Long ' 取得傳輸中斷點的位元組數量
Winsock1.GetData sVar, vbString
Select Case Trim(sVar)
Case "資料接收完畢"
Label3.Caption = Label3.Tag & "檔案接收完畢"
' 表示主機端已經開啟二進位檔案的寫入模式
Case "準備就緒"
Label3.Caption = Label3.Tag & "檔案傳送中..."
TotalBytes = FileLen(SendFileName)
' 假設每次讀取 1024個位元組
' 取得檔案位元組數量和 1024的餘數
Mods = TotalBytes Mod 1024 ' 取餘數
Quotient = Fix(TotalBytes / 1024) ' 取商數
FileNo = FreeFile ' 取得可用的檔案通道
ReDim Buffers(1023) ' 重新宣告位元組陣列的大小
Open SendFileName For Binary Access Read As #FileNo
' 執行迴圈讀取檔案內容
For I = 1 To Quotient
Get #FileNo, , Buffers ' 從檔案讀取位元組資料
DoEvents
Winsock2.SendData Buffers ' 傳送檔案的位元組資料
Next
' 處理最後的『第n部分』
If Mods <> 0 Then
' 餘數的數值即為最後需要傳送的位元組數量
ReDim Buffers(Mods - 1)
Get #FileNo, , Buffers ' 從檔案讀取剩餘的位元組資料
Winsock2.SendData Buffers ' 傳送檔案的位元組資料
DoEvents
End If
Close #FileNo
' 告訴主機端檔案已經傳送完畢
Winsock1.SendData "傳送完畢"
DoEvents
Case Else
If Mid(sVar, 1, 4) = "斷點續傳" Then
' 取得斷點位元組數量
BreakPoint = CLng(Mid(sVar, 5))
TotalBytes = FileLen(SendFileName) - BreakPoint
' 假設每次讀取 1024個位元組
' 取得檔案位元組數量和 1024的餘數
Mods = TotalBytes Mod 1024 ' 取餘數
Quotient = Fix(TotalBytes / 1024) ' 取商數
FileNo = FreeFile ' 取得可用的檔案通道
Open SendFileName For Binary Access Read As #FileNo
ReDim Buffers(BreakPoint - 1) ' 重新宣告位元組陣列的大小
Get #FileNo, , Buffers ' 讀取但不處理
DoEvents
ReDim Buffers(1023) ' 重新宣告位元組陣列的大小
' 執行迴圈讀取檔案內容
For I = 1 To Quotient
Get #FileNo, , Buffers ' 從檔案讀取位元組資料
Winsock2.SendData Buffers ' 傳送檔案的位元組資料
DoEvents
Next
' 處理最後的『第n部分』
If Mods <> 0 Then
' 餘數的數值即為最後需要傳送的位元組數量
ReDim Buffers(Mods - 1)
Get #FileNo, , Buffers ' 從檔案讀取剩餘的位元組資料
Winsock2.SendData Buffers ' 傳送檔案的位元組資料
DoEvents
End If
Close #FileNo
' 告訴主機端檔案已經傳送完畢
Winsock1.SendData "傳送完畢"
DoEvents
End If
End Select
End Sub

vbnet socket 實例

服务端
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Text
Public Class Form1
Dim s As Socket
Dim t As Thread

Delegate Sub setTextGetBack(ByVal arg1 As Integer, ByVal arg2 As Byte()) ''声明委托,异步调用

Private Sub setText(ByVal arg1 As Integer, ByVal arg2 As Byte())
If Me.ListBox1.InvokeRequired Then
Dim stg As setTextGetBack = New setTextGetBack(AddressOf setText)
Me.Invoke(stg, New Object() {arg1, arg2})
Else
Me.ListBox1.Items.Insert(arg1, Encoding.Unicode.GetString(arg2))
End If

End Sub

Public Sub waitData()
s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '‘声明一个socket,使用tcp协议
Dim localEndPoint As New IPEndPoint(IPAddress.Parse("172.17.53.90"), 1024)
s.Bind(localEndPoint) '‘绑定到一台服务器
s.Listen(100) '‘侦听,最多可以侦听100连接

While True
Dim bytes(1024) As Byte '‘用来存储接收的数据字节
Dim ss As Socket = s.Accept() '‘若接收到,则创建一个新的socket与之连接
ss.Receive(bytes) '‘接收数据
setText(0, bytes) '‘处理接收到的数据
End While

End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
t = New Thread(AddressOf waitData)
t.Start()
Dim bytes(1024) As Byte
bytes = Encoding.Unicode.GetBytes("~~~~~~~~~~~~~~~~服务器开始启动~~~~~~~~~~~~~~~~")
Button1.Enabled = False
setText(0, bytes)
Try


's.Close()
't.Abort()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "错误提示")
Finally

End Try
End Sub

Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
Try

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "错误提示")
Finally
s.Close() '‘关闭socket
t.Abort() ''中止线程
End Try
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
s.Close()
t.Abort()
Button1.Enabled = True
Button2.Enabled = False
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "错误提示")
End Try

End Sub
End Class


客户端
Imports System.Threading
Imports System.Text
Imports System.Net
Imports System.Net.Sockets
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim s As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim endPint As IPEndPoint = New IPEndPoint(IPAddress.Parse("172.17.53.90"), 1024)
s.Connect(endPint)
s.Send(Encoding.Unicode.GetBytes(TextBox1.Text))
s.Close()
Catch ex As Exception

End Try
End Sub
End Class

vbnet socket 傳送文件

服务端:
Imports System.Text '
Imports System.Net.Sockets
Imports System.Net
Imports System.IO
Public Class Form1
Dim socket As Socket
Delegate Sub setText(ByVal text As String)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim localEndPoint As New IPEndPoint(Net.IPAddress.Parse("172.17.53.90"), 9999)
socket.Bind(localEndPoint)
socket.Listen(3)
SetLableText("~~~~~~~~~~~~服务已开始启动~~~~~~~~~~~~~~")
While True
Dim fileStream As FileStream = New FileStream("mytest.doc", FileMode.OpenOrCreate, FileAccess.ReadWrite)
Dim byteArray(6553500) As Byte
Dim binary As New BinaryWriter(fileStream)
Dim receiveSocket As Socket = socket.Accept()
receiveSocket.Receive(byteArray)
binary.Write(byteArray, 0, byteArray.Length - 1)
receiveSocket.Shutdown(SocketShutdown.Receive)
FileStream.Close()
receiveSocket.Close()
End While


End Sub
Private Sub SetLableText(ByVal txt As String)

If Label1.InvokeRequired Then
Dim st As setText = New setText(AddressOf SetLableText)
Me.Invoke(st, New Object() {txt})
Else
Label1.Text = txt
End If

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Label1.Text = "淡淡的"
End Sub
End Class
客户端:
Imports System.Text
Imports System.Net.Sockets
Imports System.Net
Imports System.IO
Public Class Form1
Dim fileName = ""
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OpenFileDialog1.Filter = "All Documents(*.*)|*.*|Word Documents|*.doc"
OpenFileDialog1.FilterIndex = 1
OpenFileDialog1.RestoreDirectory = True
OpenFileDialog1.InitialDirectory = "c:\"

If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
fileName = OpenFileDialog1.FileName
End If
TextBox1.Text = fileName
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim sendSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim endPoint As New IPEndPoint(Net.IPAddress.Parse("172.17.53.90"), 9999)
sendSocket.Connect(endPoint)
Dim file As FileStream = New FileStream(TextBox1.Text, FileMode.Open)
Dim binaryRead As New BinaryReader(file)
Dim byteArray(file.Length - 1) As Byte
binaryRead.Read(byteArray, 0, file.Length - 1)
sendSocket.Send(byteArray)
file.Close()
sendSocket.Shutdown(SocketShutdown.Send)
sendSocket.Close()
Label2.Text = "文档已经创送完毕!"
End Sub
End Class