07. september 2004 - 09:31
#6
Der er flere måder:
1) download server1->client + upload client->server2
Der kan du bruge C# koden fra linket, builde til DLL og lade din VB.NET kode
lave download og upload.
2) streame server1->client->server2
Her er noget kode lavet udfra noget kode jeg har lavet til et andet spørgsmål:
Imports System
Imports System.IO
Imports System.Text
Imports System.Net.Sockets
Imports System.Threading
Public Class FtpClient
Private ctrl As TcpClient
Private ctrlstm As NetworkStream
Private data As TcpClient
Private datastm As NetworkStream
Private Shared Sub Send(ByVal stm As NetworkStream, ByVal line As String)
Dim b As Byte() = Encoding.Default.GetBytes(line)
stm.Write(b, 0, b.Length)
End Sub
Private Shared Function Receive(ByVal stm As NetworkStream) As String
Dim b(100000 - 1) As Byte
Dim ix As Integer = 0
Dim n As Integer
While stm.DataAvailable
n = stm.Read(b, ix, b.Length - ix)
ix += n
End While
Return Encoding.Default.GetString(b, 0, ix)
End Function
Public Shared Function Command(ByVal stm As NetworkStream, ByVal cmd As String) As String
Send(stm, cmd + Convert.ToChar(13) + Convert.ToChar(10))
Thread.Sleep(50)
Return Receive(stm)
End Function
Private Sub SetupData()
Dim dataaddr As String = Command(ctrlstm, "PASV")
Dim addrparts As String() = dataaddr.Split("()".ToCharArray)(1).Split(",".ToCharArray)
Dim datahost As String = addrparts(0) + "." + addrparts(1) + "." + addrparts(2) + "." + addrparts(3)
Dim dataport As Integer = Integer.Parse(addrparts(4)) * 256 + Integer.Parse(addrparts(5))
data = New TcpClient (datahost, dataport)
datastm = data.GetStream
End Sub
Public Sub New(ByVal host As String, ByVal username As String, ByVal password As String)
ctrl = New TcpClient (host, 21)
ctrlstm = ctrl.GetStream
Command(ctrlstm, "USER " + username)
Command(ctrlstm, "PASS " + password)
End Sub
Public Function Dir() As String
SetupData
Command(ctrlstm, "LIST")
Dim res As String = Receive(datastm)
Receive(ctrlstm)
datastm.Close
data.Close
Return res
End Function
Public Function ShortDir() As String
SetupData
Command(ctrlstm, "NLST")
Dim res As String = Receive(datastm)
Receive(ctrlstm)
datastm.Close
data.Close
Return res
End Function
Public Sub MkDir(ByVal dir As String)
Command(ctrlstm, "MKD " + dir)
End Sub
Public Sub RmDir(ByVal dir As String)
Command(ctrlstm, "RMD " + dir)
End Sub
Public Sub ChDir(ByVal dir As String)
Command(ctrlstm, "CWD " + dir)
End Sub
Public Sub UpLoad(ByVal filename As String, ByVal binary As Boolean)
If binary Then
Command(ctrlstm, "TYPE I")
Else
Command(ctrlstm, "TYPE A")
End If
SetupData
Command(ctrlstm, "STOR " + filename)
Receive(ctrlstm)
Dim f As FileStream = New FileStream (filename, FileMode.Open)
Dim b(100000 - 1) As Byte
Dim ix As Integer = 0
Dim n As Integer
While ix < f.Length
n = f.Read(b, 0, b.Length)
datastm.Write(b, 0, n)
Thread.Sleep(100)
ix += n
End While
f.Close
datastm.Close
data.Close
End Sub
Public Sub DownLoad(ByVal filename As String, ByVal binary As Boolean)
If binary Then
Command(ctrlstm, "TYPE I")
Else
Command(ctrlstm, "TYPE A")
End If
SetupData
Command(ctrlstm, "RETR " + filename)
Receive(ctrlstm)
Dim f As FileStream = New FileStream (filename, FileMode.Create)
Dim b(100000 - 1) As Byte
Dim n As Integer
While datastm.DataAvailable
n = datastm.Read(b, 0, b.Length)
f.Write(b, 0, n)
Thread.Sleep(100)
End While
f.Close
datastm.Close
data.Close
End Sub
Public Function InitUpLoad(ByVal filename As String, ByVal binary As Boolean) As NetworkStream
If binary Then
Command(ctrlstm, "TYPE I")
Else
Command(ctrlstm, "TYPE A")
End If
SetupData
Command(ctrlstm, "STOR " + filename)
Receive(ctrlstm)
Return datastm
End Function
Public Sub EndUpload
datastm.Close
data.Close
End Sub
Public Function InitDownLoad(ByVal filename As String, ByVal binary As Boolean) As NetworkStream
If binary Then
Command(ctrlstm, "TYPE I")
Else
Command(ctrlstm, "TYPE A")
End If
SetupData
Command(ctrlstm, "RETR " + filename)
Receive(ctrlstm)
Return datastm
End Function
Public Sub EndDownload
datastm.Close
data.Close
End Sub
Public Sub Logout()
Command(ctrlstm, "QUIT")
ctrlstm.Close
ctrl.Close
End Sub
End Class
Public Class Fxp
Public Shared Sub Transfer(fromhost As String, fromuser As String, frompass As String, _
path As String, filename As String, binary As Boolean, _
tohost As String, touser As String, topass As String)
Dim fromcli As FtpClient = New FtpClient(fromhost, fromuser, frompass)
Dim tocli As FtpClient = New FtpClient(tohost, touser, topass)
fromcli.ChDir(path)
tocli.ChDir(path)
Dim istm As NetworkStream = fromcli.InitDownLoad(filename, binary)
Dim ostm As NetworkStream = tocli.InitUpLoad("_" & filename, binary)
Dim b(100000 - 1) As Byte
Dim n As Integer
While istm.DataAvailable
n = istm.Read(b, 0, b.Length)
ostm.Write(b, 0, n)
Thread.Sleep(100)
End While
fromcli.EndDownLoad
tocli.EndUpLoad
fromcli.Logout
tocli.Logout
End Sub
End Class
Class TestClass
Public Shared Sub Main(ByVal args As String())
Fxp.Transfer("localhost", "anonymous", "arne@", ".", "z.zip", True, "localhost", "anonymous", "arne@")
End Sub
End Class
3) triangle with control connection client-server1 og client-server2 og data
connection server1-server2
Den er lidt tricky.
Men ovenstående kode kan også bruges som grundsten i den.