听说socket可以实现,求指教

解决方案 »

  1.   

    本帖最后由 bdmh 于 2012-09-29 13:39:45 编辑
      

  2.   


    using System;
    using System.Net;
    using System.IO;
    using System.Text;
    using System.Net.Sockets;
    using log4net;namespace AutoUploadPDFFiles
    {
        ///<summary>
        /// FTP客户端类库
        ///</summary>
        public class FTPClient
        {
            
            private string
             remoteHost, remotePath, remoteUser, remotePass, mes;
            private int remotePort, bytes;
            private Socket clientSocket;        private int retValue;
            private Boolean debug;
            private Boolean logined;
            private string reply;        private static int BLOCK_SIZE = 512;
            private ILog logger;        Byte[] buffer = new Byte[BLOCK_SIZE];
            Encoding ASCII = Encoding.ASCII;        public FTPClient()
            {            remoteHost = "localhost";
                remotePath = ".";
                remoteUser = "FTPUser";
                remotePass = "abcDEF123";
                remotePort = 21;
                debug = false;
                logined = false;            logger = LogManager.GetLogger("logAll");        }
            public string RemoteHost
            {
                get { return remoteHost; }
                set { remoteHost = value; }
            }        public int RemotePort
            {
                get { return remotePort; }
                set { remotePort = value; }
            }         public string RemotePath
            {
                get { return remotePath; }
                set { remotePath = value; }
            }         public string UserName
            {
                set { remoteUser = value; }
            }        /// <summary>
            /// 获取或设置远程主机登陆密码
            /// </summary>
            public string Password
            {
                set { remotePass = value; }
            }        public string[] GetFileList(string mask, bool longDirListing)
            {
                if (!logined)
                {
                    Login();
                }            Socket cSocket = createDataSocket();            if (!longDirListing)
                    sendCommand("NLST " + mask);
                else
                    sendCommand("LIST " + mask);            if (!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }            mes = "";            while (true)
                {                int bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    mes += ASCII.GetString(buffer, 0, bytes);                if (bytes < buffer.Length)
                    {
                        break;
                    }
                }            char[] seperator = { '\n' };
                string[] mess = mes.Split(seperator);            cSocket.Close();            readReply();            if (retValue != 226)
                {
                    throw new IOException(reply.Substring(4));
                }
                return mess;        }        public long GetFileSize(string fileName)
            {            if (!logined)
                {
                    Login();
                }            sendCommand("SIZE " + fileName);
                long size = 0;            if (retValue == 213)
                {
                    size = Int64.Parse(reply.Substring(4));
                }
                else
                {
                    throw new IOException(reply.Substring(4));
                }            return size;        }
            public void Login()
            {            clientSocket = new
                 Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ep = new
                 IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);            try
                {
                    logger.Info("begin to connect." + remoteUser + ":" + remotePass);                clientSocket.Connect(ep);
                }
                catch (Exception ex)
                {
                    logger.Error(ex.Message);
                    throw new IOException("Couldn't connect to remote server");
                }            readReply();
                if (retValue != 220)
                {
                    Close();
                    logger.Info(reply);
                    throw new IOException(reply.Substring(4));
                }
                if (debug)
                    Console.WriteLine("USER " + remoteUser);            sendCommand("USER " + remoteUser);            if (!(retValue == 331 || retValue == 230))
                {
                    cleanup();
                    logger.Info(reply);
                    throw new IOException(reply.Substring(4));
                }            if (retValue != 230)
                {
                    if (debug)
                        Console.WriteLine("PASS xxx");                sendCommand("PASS " + remotePass);
                    if (!(retValue == 230 || retValue == 202))
                    {
                        cleanup();
                        logger.Error(reply);
                        throw new IOException(reply.Substring(4));
                    }
                }            logined = true;
                logger.Info("Connected to " + remoteHost);            Chdir(remotePath);        }
            public void SetBinaryMode(Boolean mode)
            {            if (mode)
                {
                    sendCommand("TYPE I");
                }
                else
                {
                    sendCommand("TYPE A");
                }
                if (retValue != 200)
                {
                    throw new IOException(reply.Substring(4));
                }
            }
      

  3.   

            public void Download(string remFileName)
            {
                Download(remFileName, "", false);
            }        public void Download(string remFileName, Boolean resume)
            {
                Download(remFileName, "", resume);
            }        public void Download(string remFileName, string locFileName)
            {
                Download(remFileName, locFileName, false);
            }        public void Download(string remFileName, string
             locFileName, Boolean resume)
            {
                if (!logined)
                {
                    Login();
                }            SetBinaryMode(true);            Console.WriteLine("Downloading file " + remFileName + " from " + remoteHost + "/" + remotePath);            if (locFileName.Equals(""))
                {
                    locFileName = remFileName;
                }            if (!File.Exists(locFileName))
                {
                    Stream st = File.Create(locFileName);
                    st.Close();
                }            FileStream output = new
                 FileStream(locFileName, FileMode.Open);            Socket cSocket = createDataSocket();            long offset = 0;            if (resume)
                {                offset = output.Length;                if (offset > 0)
                    {
                        sendCommand("REST " + offset);
                        if (retValue != 350)
                        {
                            //throw new IOException(reply.Substring(4));
                            //Some servers may not support resuming.
                            offset = 0;
                        }
                    }                if (offset > 0)
                    {
                        if (debug)
                        {
                            Console.WriteLine("seeking to " + offset);
                        }
                        long npos = output.Seek(offset, SeekOrigin.Begin);
                        Console.WriteLine("new pos=" + npos);
                    }
                }            sendCommand("RETR " + remFileName);            if (!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }            while (true)
                {                bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    output.Write(buffer, 0, bytes);                if (bytes <= 0)
                    {
                        break;
                    }
                }            output.Close();
                if (cSocket.Connected)
                {
                    cSocket.Close();
                }            Console.WriteLine("");            readReply();            if (!(retValue == 226 || retValue == 250))
                {
                    throw new IOException(reply.Substring(4));
                }        }
            public void Upload(string fileName)
            {
                Upload(fileName, false);
            }
            public void Upload(string fileName, Boolean resume)
            {            if (!logined)
                {
                    Login();
                }            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)
                    {
                        //throw new IOException(reply.Substring(4));
                        //Remote server may not support resuming.
                        offset = 0;
                    }
                }            sendCommand("STOR " + Path.GetFileName(fileName));            if (!(retValue == 125 || retValue == 150))
                {
                    throw new IOException(reply.Substring(4));
                }            // open input stream to read source file
                FileStream input = new
                 FileStream(fileName, FileMode.Open);            if (offset != 0)
                {                if (debug)
                    {
                        Console.WriteLine("seeking to " + offset);
                    }
                    input.Seek(offset, SeekOrigin.Begin);
                }            Console.WriteLine("Uploading file " + fileName + " to " + remotePath);            while ((bytes = input.Read(buffer, 0, buffer.Length)) > 0)
                {                cSocket.Send(buffer, bytes, 0);            }
                input.Close();            Console.WriteLine("");            if (cSocket.Connected)
                {
                    cSocket.Close();
                }            readReply();
                if (!(retValue == 226 || retValue == 250))
                {
                    throw new IOException(reply.Substring(4));
                }
            }
            public void DeleteRemoteFile(string fileName)
            {            if (!logined)
                {
                    Login();
                }            sendCommand("DELE " + fileName);            if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }        }
            public void RenameRemoteFile(string oldFileName, string newFileName)
            {            if (!logined)
                {
                    Login();
                }            sendCommand("RNFR " + oldFileName);            if (retValue != 350)
                {
                    throw new IOException(reply.Substring(4));
                }            sendCommand("RNTO " + newFileName);
                if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }        }
            public void Mkdir(string dirName)
            {            if (!logined)
                {
                    Login();
                }            sendCommand("MKD " + dirName);            if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }        }
            public void Rmdir(string dirName)
            {            if (!logined)
                {
                    Login();
                }            sendCommand("RMD " + dirName);            if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }        }        public void Chdir(string dirName)
            {            if (dirName.Equals("."))
                {
                    return;
                }            if (!logined)
                {
                    Login();
                }            sendCommand("CWD " + dirName);            if (retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }            this.remotePath = dirName;            Console.WriteLine("Current directory is " + remotePath);        }
            public void Close()
            {            if (clientSocket != null)
                {
                    sendCommand("QUIT");
                }            cleanup();
                Console.WriteLine("Closing...");
            }
            public bool Debug
            {
                set { debug = value; }
                get { return debug; }
            }
      

  4.   

            public void readReply()
            {
                mes = "";
                reply = readLine();
                retValue = Int32.Parse(reply.Substring(0, 3));
            }        private void cleanup()
            {
                if (clientSocket != null)
                {
                    clientSocket.Close();
                    clientSocket = null;
                }
                logined = false;
            }        private string readLine()
            {            while (true)
                {
                    bytes = clientSocket.Receive(buffer, buffer.Length, 0);
                    mes += ASCII.GetString(buffer, 0, bytes);
                    if (bytes < buffer.Length)
                    {
                        break;
                    }
                }            char[] seperator = { '\n' };
                string[] mess = mes.Split(seperator);            if (mes.Length > 2)
                {
                    mes = mess[mess.Length - 2];
                }
                else
                {
                    mes = mess[0];
                }            if (!mes.Substring(3, 1).Equals(" "))
                {
                    return readLine();
                }            if (debug)
                {
                    for (int k = 0; k < mess.Length - 1; k++)
                    {
                        Console.WriteLine(mess[k]);
                    }
                }
                return mes;
            }        public void sendCommand(String command)
            {            Byte[] cmdBytes =
                 Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
                clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
                readReply();
            }        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;
            }        public string ServerResponse
            {
                get { return reply; }
            }
            public int ResponseCode
            {
                get { return retValue; }
            }
        }
    }
      

  5.   

    http://www.cnblogs.com/hzuit/articles/682744.html
    也许你能用得到
      

  6.   

    你得先知道远程服务器提供的是不是FTP服务,还是其他端口之类的 
      

  7.   

    不是FTP你就得改端口,改通讯握手的命令啊 这些必须有,啥也没有咋搞呢
      

  8.   

    局域网内有权限就可以直接写,用不着socket。关键你说了个“远程” 貌似在公网上。