主要实现文件的传输和时间的简单校正
一,服务器端的实现:
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Public Class SendFile
Private flStream As FileStream
Private Const TOTAL_LENGTH As Integer = 94
Private remoteEP As IPEndPoint
Private cliSocket As Socket
Private bIsRun As Boolean = False
Private remoteIP As String = ""
Private remotePort As String = ""
Private bytStream(TOTAL_LENGTH - 1) As Byte
Private sendData As String
Private receivedData(1024) As Byte
Private intBytCnt As Integer = 0
Private Const strTestFileNM As String = "test.txt"
Public Function SendAllFile(ByVal strFileName() As String) As Boolean
Dim intIdx As Integer = 0
Try
SendAllFile = False
If GetIPAndPort(remoteIP, remotePort) = False Then
'ERROR
Exit Function
End If
remoteEP = New IPEndPoint(Net.IPAddress.Parse(remoteIP), CInt(remotePort))
cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
cliSocket.Connect(remoteEP)
bIsRun = True
'文件名排序
Array.Sort(strFileName)
'送信
For intIdx = 0 To strFileName.Length - 1
Try
flStream = New FileStream(strFileName(intIdx), FileMode.Open, FileAccess.Read)
flStream.Read(bytStream, 0, TOTAL_LENGTH)
flStream.Close()
Catch ex As Exception
Continue For
End Try
'送信
sendData = strFileName(intIdx).Replace(SDCARD_TEMP_FOLDER, "") & "@" & _
Encoding.GetEncoding(FILE_ENCODING).GetString(bytStream, 0, bytStream.Length)
cliSocket.Send(Encoding.GetEncoding(FILE_ENCODING).GetBytes(sendData))
'等待服务器端的确认
While True
intBytCnt = cliSocket.Receive(receivedData)
If Encoding.Default.GetString(receivedData, 0, intBytCnt) = "OK" Then
Exit While
End If
Array.Clear(receivedData, 0, receivedData.Length)
End While
'文件拷贝
File.Copy(strFileName(intIdx), FOLDER & strFileName(intIdx).Replace(SDCARD_TEMP_FOLDER, ""))
File.Delete(strFileName(intIdx))
flStream = New FileStream(FOLDER & strTestFileNM, FileMode.Append, FileAccess.Write)
flStream.Write(bytStream, 0, TOTAL_LENGTH)
flStream.Close()
flStream = Nothing
Next
'送信完了
cliSocket.Send(Encoding.Default.GetBytes("exit"))
cliSocket.Shutdown(SocketShutdown.Both)
cliSocket.Close()
cliSocket = Nothing
bIsRun = False
SendAllFile = True
Catch ex As Exception
If bIsRun Then
cliSocket.Send(Encoding.Default.GetBytes("exit"))
cliSocket.Shutdown(SocketShutdown.Both)
cliSocket.Close()
cliSocket = Nothing
bIsRun = False
End If
'ERROR
End Try
End Function
#End Region
Private Function GetIPAndPort(ByRef ip As String, ByRef port As String) As Boolean
GetIPAndPort = False
Dim myCAKintcpEnv As New CAKintcpEnv
Dim myCKintcpEnv As New CKintcpEnv
Dim strIPAddress as string = “192.168.1.0”
ip = CInt(Mid(strIPAddress, 1, 3)).ToString & "." & _
CInt(Mid(strIPAddress, 4, 3)).ToString & "." & _
CInt(Mid(strIPAddress, 7, 3)).ToString & "." & _
CInt(Mid(strIPAddress, 11, 3)).ToString
port = myCKintcpEnv.portNo '端口号
GetIPAndPort = True
End If
End Function
#End Region
'服务器端时间的取得
Public Function GetServerDateTime() As Date
Try
'IP地址取得
If GetIPAndPort(remoteIP, remotePort) = False Then
'ERROR
Exit Function
End If
remoteEP = New IPEndPoint(Net.IPAddress.Parse(remoteIP), CInt(remotePort))
cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
cliSocket.Connect(remoteEP)
cliSocket.Send(Encoding.GetEncoding(FILE_ENCODING).GetBytes("GetSystemTime"))
intBytCnt = cliSocket.Receive(receivedData)
GetServerDateTime = System.DateTime.Parse(Encoding.GetEncoding("shift-jis").GetString(receivedData, 0, intBytCnt))
cliSocket.Shutdown(SocketShutdown.Both)
cliSocket.Close()
cliSocket = Nothing
Catch ex As Exception
‘ERROR
End Try
End Function
#End Region
End Class