Public Sub sendFiletoMS(ByVal skt As Socket, ByVal mszh As UInt16, ByVal fldata As Byte(), ByVal fn_ms As String)
Dim baarsends As New List(Of Byte) '創建命令集資料串列
'“ALC”頭碼 3個位元組、站號(2個位元組)、功能碼(1個位元組)、資料總位元組數(4個位元組)、實際資料(N個位元組);
'01 發送檔案,格式:檔案名長度占1位元組、檔案名(包括后綴)、本次檔案存盤開始(地址4位元組)(考慮檔案分段傳送),檔案資料位元組數(4位元組),檔案資料;
Dim alc() As Byte = Encoding.Default.GetBytes("ALC")
For Each b As Byte In alc
baarsends.Add(b)
Next
'寫入站號2byte
Dim zhd() As Byte = System.BitConverter.GetBytes(mszh)
Array.Reverse(zhd)
For Each b As Byte In zhd
baarsends.Add(b)
Next
'寫入能能碼
baarsends.Add(CByte(1))
'寫入資料長度2byte
Dim fndata() As Byte = Encoding.Default.GetBytes(fn_ms) '檔案名資料
'命令列固定資料長度10位元組,檔案格式固定資料長度9位元組
Dim datalen As UInt32 = 19 + fndata.Length + fldata.Length '12個固定編碼+檔案名資料長度+檔案資料長度
Dim datalend() As Byte = System.BitConverter.GetBytes(datalen)
Array.Reverse(datalend)
For Each b As Byte In datalend
baarsends.Add(b)
Next
'實際資料部分------------------------------------------------------
'寫入檔案名長度1byte
baarsends.Add(CByte(fndata.Length))
'寫入檔案名資料
For Each b As Byte In fndata
baarsends.Add(b)
Next
'寫入檔案資料地址
Dim dtaddr As UInt32 = baarsends.Count + 7
Dim dtaddrd() As Byte = System.BitConverter.GetBytes(dtaddr)
Array.Reverse(dtaddrd)
For Each b As Byte In dtaddrd
baarsends.Add(b)
Next
'寫入檔案資料長度
Dim fdtl As UInt32 = fldata.Length
Dim fdtld() As Byte = System.BitConverter.GetBytes(fdtl)
Array.Reverse(fdtld)
For Each b As Byte In fdtld
baarsends.Add(b)
Next
'寫入檔案資料
For Each b As Byte In fldata
baarsends.Add(b)
Next
skt.Send(baarsends.ToArray)
End Sub
發送代碼
Protected Overridable Sub ReadCallback(ByVal ar As IAsyncResult)
Dim content As String = String.Empty
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim handler As Socket = state.workSocket
Try
Dim bytesRead As Integer = handler.EndReceive(ar)
'此處處理訊息
'REV_mssageNOW(Encoding.Default.GetString(state.buffer))
For Each b As Byte In state.buffer
RevData_List.Add(b)
Next
Dim Data() As Byte = RevData_List.ToArray
Dim dtlld(3) As Byte
For i = 0 To 3
dtlld(i) = Data(i + 6)
Next
Array.Reverse(dtlld)
Dim datalen As UInt32 = BitConverter.ToUInt32(dtlld, 0)
If RevData_List.Count > datalen Then
'“ALC”頭碼 3個位元組、站號(2個位元組)、功能碼(1個位元組)、資料總位元組數(4個位元組)、實際資料(N個位元組);
'01 發送檔案,格式:檔案名長度占1位元組、檔案名(包括后綴)、本次檔案存盤開始(地址4位元組)(考慮檔案分段傳送),檔案資料位元組數(4位元組),檔案資料;
Dim inx As UInt32 = 0
Dim tmdata(2) As Byte
For i = 0 To 2
tmdata(i) = Data(inx)
inx += 1
Next
Dim tm As String = Encoding.Default.GetString(tmdata)
If tm = "ALC" Then
Dim zhd(1) As Byte
For i = 0 To 1
zhd(i) = Data(inx)
inx += 1
Next
Array.Reverse(zhd)
Dim zh As UInt16 = BitConverter.ToUInt16(zhd, 0)
Dim gnm As Byte = Data(inx)
inx += 1
Dim dtld(3) As Byte
For i = 0 To 3
dtld(i) = Data(inx)
inx += 1
Next
Array.Reverse(dtld)
Dim dtl As UInt32 = BitConverter.ToUInt32(dtld, 0)
Select Case gnm
Case 1
Dim flnl As Byte = Data(inx)
inx += 1
Dim flnd(flnl - 1) As Byte
For i = 0 To flnl - 1
flnd(i) = Data(inx)
inx += 1
Next
Dim fn As String = Encoding.Default.GetString(flnd.ToArray)
Dim filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\" & fn
Dim fladdrd(3) As Byte
For i = 0 To 3
fladdrd(i) = Data(inx)
inx += 1
Next
Array.Reverse(fladdrd)
Dim fladdr As UInt32 = BitConverter.ToUInt32(fladdrd, 0)
Dim fldld(3) As Byte
For i = 0 To 3
fldld(i) = Data(inx)
inx += 1
Next
Array.Reverse(fldld)
Dim fldl As UInt32 = BitConverter.ToUInt32(fldld, 0)
Using writer As BinaryWriter = New BinaryWriter(File.Open(filename, FileMode.Create))
For i = 0 To fldl - 1
writer.Write(Data(inx))
inx += 1
Next
End Using
End Select
End If
RevData_List = New List(Of Byte)
End If
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
Catch ex As Exception
End Try
End Sub 'ReadCallback
以上用SOCKET接收代碼
Private Sub ReadCallback(ByVal result As IAsyncResult)
Dim read As Integer
Try
ntstream = client.GetStream()
read = ntstream.EndRead(result)
Catch
'An error has occured when reading
Return
End Try
If read = 0 Then
'The connection has been closed.
Return
End If
Dim buffer As Byte() = TryCast(result.AsyncState, Byte())
RevData_List.AddRange(buffer)
'“ALC”頭碼 3個位元組、資料總位元組數(4個位元組)、功能碼(1個位元組)、站號(2個位元組)、實際資料(N個位元組)、CRC16(2位元組)
' 0 3 7 8 10
Dim Data() As Byte = RevData_List.ToArray
Dim dtlld(3) As Byte
For i = 0 To 3
dtlld(i) = Data(i + 6)
Next
Array.Reverse(dtlld)
Dim datalen As UInt32 = BitConverter.ToUInt32(dtlld, 0)
If RevData_List.Count > datalen Then
'“ALC”頭碼 3個位元組、站號(2個位元組)、功能碼(1個位元組)、資料總位元組數(4個位元組)、實際資料(N個位元組);
'01 發送檔案,格式:檔案名長度占1位元組、檔案名(包括后綴)、本次檔案存盤開始(地址4位元組)(考慮檔案分段傳送),檔案資料位元組數(4位元組),檔案資料;
Dim inx As UInt32 = 0
Dim tmdata(2) As Byte
For i = 0 To 2
tmdata(i) = Data(inx)
inx += 1
Next
Dim tm As String = Encoding.Default.GetString(tmdata)
If tm = "ALC" Then
Dim zhd(1) As Byte
For i = 0 To 1
zhd(i) = Data(inx)
inx += 1
Next
Array.Reverse(zhd)
Dim zh As UInt16 = BitConverter.ToUInt16(zhd, 0)
Dim gnm As Byte = Data(inx)
inx += 1
Dim dtld(3) As Byte
For i = 0 To 3
dtld(i) = Data(inx)
inx += 1
Next
Array.Reverse(dtld)
Dim dtl As UInt32 = BitConverter.ToUInt32(dtld, 0)
Select Case gnm
Case 1
Dim flnl As Byte = Data(inx)
inx += 1
Dim flnd(flnl - 1) As Byte
For i = 0 To flnl - 1
flnd(i) = Data(inx)
inx += 1
Next
Dim fn As String = Encoding.Default.GetString(flnd.ToArray)
Dim filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\" & fn
Dim fladdrd(3) As Byte
For i = 0 To 3
fladdrd(i) = Data(inx)
inx += 1
Next
Array.Reverse(fladdrd)
Dim fladdr As UInt32 = BitConverter.ToUInt32(fladdrd, 0)
Dim fldld(3) As Byte
For i = 0 To 3
fldld(i) = Data(inx)
inx += 1
Next
Array.Reverse(fldld)
Dim fldl As UInt32 = BitConverter.ToUInt32(fldld, 0)
Using writer As BinaryWriter = New BinaryWriter(File.Open(filename, FileMode.Create))
For i = 0 To fldl - 1
writer.Write(Data(inx))
inx += 1
Next
End Using
End Select
End If
RevData_List = New List(Of Byte)
End If
ntstream.BeginRead(buffer, 0, buffer.Length, AddressOf ReadCallback, buffer)
End Sub
以上用NetworkStream+TcpClient
直接使用SOCKET接收資料有問題,不知道為什么會這樣
uj5u.com熱心網友回復:


第一張SOCKET接收的
第二張NetworkStream+TcpClient接收
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/88112.html
標籤:網絡編程
