aspnet
Lập trình không biên giới 598 bài
| public class FTPClient { private string remoteHost; private string remoteUser; private string remotePass; private string remotePath;
private int remotePort = 21; private int bytes; private Socket clientSocket;
private int retValue; private Boolean logined; private string reply; private string mes = "";
private static int BLOCK_SIZE = 512;
Byte [] buffer = new Byte [BLOCK_SIZE] ; Encoding ASCII = Encoding.ASCII;
public FTPClient(string host, string user, string password) { remoteHost = host; remoteUser = user; remotePass = password; Login(); }
public void Login() { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(Dns.Resolve(remoteHost).AddressList [0] , remotePort);
try { clientSocket.Connect(ep); } catch (Exception) { throw new IOException("Couldn't connect to remote server"); }
ReadReply(); if (retValue != 220) { Close(); throw new IOException(reply.Substring(4)); }
SendCommand("USER " + remoteUser); if (!(retValue == 331 || retValue == 230)) { CleanUp(); throw new IOException(reply.Substring(4)); }
if (retValue != 230) { SendCommand("PASS " + remotePass); if (!(retValue == 230 || retValue == 202)) { CleanUp(); throw new IOException(reply.Substring(4)); } }
logined = true; }
private void ChangeDir(string dirName) { if (dirName.Equals(".")) { return; }
SendCommand("CWD " + dirName);
if (retValue != 250) { throw new IOException(reply.Substring(4)); }
this.remotePath = dirName; }
private void ReadReply() { mes = ""; reply = ReadLine(); retValue = Int32.Parse(reply.Substring(0, 3)); }
private string ReadLine() { while (true) { bytes = clientSocket.Receive(buffer, buffer.Length, 0); mes += ASCII.GetString(buffer, 0, bytes); if (bytes < buffer.Length) { break; } }
string [] messages = mes.Split('\n');
if (mes.Length > 2) { mes = messages [messages.Length - 2] ; } else { mes = messages [0] ; }
if (!mes.Substring(3, 1).Equals(" ")) { return ReadLine(); }
return mes; }
private void SendCommand(string command) { Byte [] cmdBytes = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray()); clientSocket.Send(cmdBytes, cmdBytes.Length, 0); ReadReply(); }
public void Close() { if (clientSocket != null) { SendCommand("QUIT"); }
CleanUp(); }
public void CleanUp() { if (clientSocket != null) { clientSocket.Close(); clientSocket = null; } logined = false; }
public void UploadFile(string fileName, Stream filePosted) { Socket cSocket = CreateDataSocket(); //long offset = 0;
//if (resume) //{ // try // { // SetBinaryMode(true); // offset = getFileSize(fileName); // } // catch (Exception) // { // offset = 0; // } //}
//if (offset > 0) //{ // SendCommand("REST " + offset); // if (retValue != 350) // { // offset = 0; // } //}
SendCommand("STOR " + fileName);
if (!(retValue == 125 || retValue == 150)) { throw new IOException(reply.Substring(4)); }
while ((bytes = filePosted.Read(buffer, 0, buffer.Length)) > 0) { cSocket.Send(buffer, bytes, 0); }
filePosted.Close(); if (cSocket.Connected) { cSocket.Close(); }
ReadReply(); if (!(retValue == 226 || retValue == 250)) { throw new IOException(reply.Substring(4)); } }
private Socket CreateDataSocket() { SendCommand("PASV");
if (retValue != 227) { throw new IOException(reply.Substring(4)); }
int index1 = reply.IndexOf('('); int index2 = reply.IndexOf(')'); string ipData = reply.Substring(index1 + 1, index2 - index1 - 1); int [] parts = new int [6] ;
int len = ipData.Length; int partCount = 0; string buf = "";
for (int i = 0; i < len && partCount <= 6; i++) {
char ch = Char.Parse(ipData.Substring(i, 1)); if (Char.IsDigit(ch)) buf += ch; else if (ch != ',') { throw new IOException("Malformed PASV reply: " + reply); }
if (ch == ',' || i + 1 == len) {
try { parts [partCount++] = Int32.Parse(buf); buf = ""; } catch (Exception) { throw new IOException("Malformed PASV reply: " + reply); } } }
string ipAddress = parts [0] + "." + parts [1] + "." + parts [2] + "." + parts [3] ;
int port = (parts [4] << 8) + parts [5] ;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(Dns.Resolve(ipAddress).AddressList [0] , port);
try { s.Connect(ep); } catch (Exception) { throw new IOException("Can't connect to remote server"); }
return s; }
private void SetBinaryMode(bool mode) { if (mode) { SendCommand("TYPE I"); } else { SendCommand("TYPE A"); }
if (retValue != 200) { throw new IOException(reply.Substring(4)); } } }
Chia sẻ với bà con, cái này được viết trên java, có 1 chú rất chăm chỉ chuyển sang dotnet, chạy ổn định gần như không có lỗi
|