Midapex网络开发库v2.2(更新主题:使用C#实现的FTP客户端)

工程:Midapex网络开发库
授权方式:GPL V3
版本:v2.2
运行平台:.NET 2.0
IDE:Visual Sutido 2008
(C)2008 Midapex All Rights Reserved.

工程下载地址:http://files.cnblogs.com/dyj057/MidapexNetLibv2.2.rar

v2.2功能特点:
    1.添加FtpClient的功能实现,通过该类可以实现大多数的FTP文件操作,配合FtpServer实现完整的文件传输功能。
    2.整合了Midapex.dll和Midapx.Net.dll,只需要引入一次组件,更方便使用。

v2.1功能特点:
    1.添加FtpServer的功能实现。
    2.二次开发功能,可以很容易的实现内嵌的FTP Server,实现文件的传输功能。

v2.0功能特点:
    1.使用异步Socket,它的内部使用IOCP实现,性能优越。
    2.实现通讯中的心跳功能,能即时发现处理‘死连接’现象。
    3.通过自定义报文或者文本字段实现通讯数据的自动分段。
    4.支持数据加密传输。
    5.支持Mono,可以跨平台使用该库。
    6.通过模板编程,实现各个功能模块灵活组装使用。
    7.内附完整开发指南。

具体内容请参看本博客其它内容。
PS:这两天就写Ftp client代码了,累就一个字。。。。希望大家满意。

Ftp Client示例代码:

class Program
    {
        
static void Main(string
[] args)
        {
            Trace.Listeners.Add(
new
 ConsoleTraceListener());
            TimeCounter counter 
= new
 TimeCounter();
            counter.Start();

            
try

            {
                
//设置服务器的地址,端口,登陆帐号
                using (FtpClient client = new FtpClient("127.0.0.1"21"ftp""ftp"))
                {
                        
//先连接服务器

                        client.Connect();
                        
//然后发送登陆信息

                        client.Login();
                        client.GetCurrentDir();
                        client.ChangeDir(
"/"
);

                        
//列出根目录下的文件或目录

                        List<FtpPathItem> items = client.List();
                        
foreach (FtpPathItem item in
 items)
                        {
                            
if
 (item.IsFile)
                                Console.WriteLine(
"<FILE> " +
 item.Name);
                            
else

                                Console.WriteLine(
"<DIR> " + item.Name);
                        }

                        
//生成一个新的随机名称目录 

                        string newDir = ShortGuid.Create().ToShortString();
                        client.CreateDir(newDir);
                        client.ChangeDir(newDir);

                        Console.WriteLine(
"CURRENT DIR:" +
 client.CurrentDir);

                        
string remoteFile = "nba_upload.jpg"
;
                        
string localFile = "nba.jpg"
;

                        
//上传文件

                        Console.WriteLine("UPLOAD  FILE:" + localFile);
                        client.Upload(remoteFile, localFile);

                        
//同步下载文件

                        localFile = "nba_down_sync.jpg";
                        Console.WriteLine(
"SYNC DOWNLOAD  FILE:" +
 localFile);
                        client.Download(remoteFile, localFile);

                        
//退到上一级目录

                        client.ChangeDir("..");

                        
//删除刚才创建的文件

                        client.DeleteFile(newDir + "/" + remoteFile);
                        
//生成一个新的随机目录名称,然后重命名刚创建的目录

                        string newDir2 = ShortGuid.Create().ToShortString();
                        client.RenamePath(newDir, newDir2);

                        
//删除刚才创建的目录

                        client.DeleteDir(newDir2);

                        
//断开与服务器的连接

                        client.Disconnect();
                        counter.Stop();
                        Console.WriteLine(
"RUN TIME:" + counter.Milliseconds + "ms"
);
                        Console.WriteLine(
"Press enter key to exit."
);
                        Console.ReadLine();
                    }
            }
            
catch
 (System.Exception e)
            {
                NetDebuger.PrintErrorMessage(e.ToString());
                Console.ReadLine();
            }
        }
    }
posted @ 2008-04-18 20:23 南桥一梦 阅读(3466) 评论(45) 编辑 收藏

 回复 引用 查看   
#1楼2008-04-18 20:35 | rockshit      
支持
 回复 引用 查看   
#2楼2008-04-18 20:43 | 蜗牛身上的一只蚂蚁      
学习。感谢BZ(博主),期待更多知识。。。
 回复 引用 查看   
#3楼[楼主]2008-04-18 21:06 | 天下叁      
@蜗牛身上的一只蚂蚁
@rockshit
谢谢支持。
你们的支持是对我最大的鼓励。

 回复 引用   
#4楼2008-04-18 21:23 | bbsky[未注册用户]
8错,辛苦了
 回复 引用 查看   
#5楼[楼主]2008-04-18 21:36 | 天下叁      
下一步,打算加入异步操作特性,然后用WinForm做一个像CuteFtp那样的软件。
 回复 引用 查看   
#6楼2008-04-18 22:05 | 生鱼片      
支持下
 回复 引用   
#7楼2008-04-19 08:34 | PPpp[未注册用户]
支持
 回复 引用   
#8楼2008-04-19 11:05 | ganquan[未注册用户]
可以断点吗?
 回复 引用 查看   
#9楼[楼主]2008-04-19 11:10 | 天下叁      
现阶段客户端不支持断点传输。
 回复 引用 查看   
#10楼2008-04-19 17:53 | FLYabroad      
不错 顶一个
 回复 引用   
#11楼2008-04-19 21:37 | cw[未注册用户]
大哥! 利害, 这么快就有了FTP客户端....

想请教一个问题, 如果我想通过FTP更新一个HTML文件, 一般要经过几个步骤?
是直接通过FTP远程更改还是先要下载到本地,改完后再远程更新到服务器?

谢谢....


 回复 引用 查看   
#12楼[楼主]2008-04-19 23:26 | 天下叁      
如果使用FTP的话,不能直接更改,需要下载到本地修改后,再上传到服务器上去。
 回复 引用   
#13楼2008-04-25 10:04 | scarroot[未注册用户]
使用异步Socket,它的内部使用IOCP实现,性能优越。

请教:
有没有进行过性能测试。

测试了一下sonic.net 模拟的IOCP库(c#),
客户端:3台机子,每台模拟1500客户,共4500 个客户端,
服务器:P D双核2.0G,2G内存,
局域网测试

客户端连接 -> 发一条信息 -> 服务器收到 -> 再send back一条信息.
-> 客户端Sleep 2秒.-> 重复.

测试结果为服务器可以正常运行,cpu利用率经常去到 100%,内存90多M,非页面缓存1M多.

如果再增加客户连接,还可以连接,不会出现繁忙状态.同时,日志记录到并没有客户出现掉线的情况.


 回复 引用   
#14楼2008-04-25 10:12 | scarroot[未注册用户]
对比:
以上为codeproject上的sonic.net写的iocp库的测试

 回复 引用 查看   
#15楼[楼主]2008-04-27 13:14 | 天下³      
有时间,就做个这样的测试。
 回复 引用 查看   
#16楼2008-05-10 11:01 | somesongs      
一段时间没有,cnblogs最喜欢的老大更新了这么多!!!敬礼!
 回复 引用   
#17楼2008-05-16 19:39 | scarrootClone[未注册用户]
难道没有作过极限测试?


for (int i = 0; i < 2000; i++)
{
EchoClient client = new EchoClient();
//主机监听端口
client.Port = 7777;
//主机名称
client.Host = "192.168.2.238";
System.Threading.Thread th = new Thread
(new ThreadStart(client.Start));
th.IsBackground = true;
th.Start();
Thread.Sleep(500);

}

Console.WriteLine("Press enter to exit...");
Console.ReadLine();


2000个客户下,server就有些不正常咯....如当前存活的client数量,

再加多2000个客户(另一机子),那么另一机子的client会出现频繁掉线.


不知是我测试有误还是用法有错?



 回复 引用   
#18楼2008-05-18 13:52 | scarrootClone[未注册用户]
代码中对多线程控制不足~...


 回复 引用 查看   
#19楼[楼主]2008-05-19 00:37 | 天下³      
谢谢楼上的测试,我会进一步跟进。
 回复 引用   
#20楼2008-05-29 16:55 | luaaok[未注册用户]
请教一下:

如果我要作一个服务器,他包含了所有可能的传输类型,如echo,ftp,filetransfer,
==,就好像你的Midapex库中的那些例子,但我在使用Midapex库时,不可能每种传输类型都开一个server来监听吧,那么,我应该如何来根据tcpserverbase来写这个通用的类,而不是像你给出的例子那样继承tcpserverbase,因为这样继承又回到了开头的问题:不可能每样传输类型都new 一个server来监听...

我应该如何规划这个类?



俺是beginner,恳请指点.

 回复 引用 查看   
#21楼[楼主]2008-05-29 23:01 | 天下³      
把多个实现,聚合在一个类里面,应该可以,是这样吗?
 回复 引用   
#22楼2008-05-30 13:01 | luaaok[未注册用户]
应该是这个想法,可以?
 回复 引用   
#23楼2008-06-07 15:19 | user001[未注册用户]
有没有看过ESFramework框架?相比之下,你这个too simple

http://www.cnblogs.com/zhuweisky/archive/2006/04/13/374025.html

 回复 引用 查看   
#24楼2008-06-08 14:09 | somesongs      
@user001

人家都不开源了。

 回复 引用   
#25楼2008-06-26 11:00 | Benny L@M[未注册用户]
Hi, when i use your component, it always show "对象已经在运行,请先停止对象再启动". How to fix? Thanks!
 回复 引用   
#26楼2008-09-23 21:02 | code100[未注册用户]
想学习一下c#网络编程,有没有相关的书籍推荐一下?
 回复 引用 查看   
#27楼2008-12-28 17:37 | xland      
为什么只能通过127.0.0.1,访问FTP服务
 回复 引用 查看   
#28楼2008-12-28 17:38 | xland      
设置了serverIp也不行
难道是因为我在局域网内吗

 回复 引用 查看   
#29楼[楼主]2008-12-29 10:20 | 天下³      
请查看你使用的防火墙设置,FTP服务不光使用的是23端口,还有数据连接端口。
 回复 引用 查看   
#30楼2008-12-30 08:15 | xland      
你好:
十分想研究,使用你的程序,如果可以请加下我的QQ好吗
我的QQ:897564856

我把程序中所有用到127.0.0.1的地方都改成我的局域网IP
还是不能使用我的局域网IP连接FTP服务
下面是FLASH FXP的连接提示:

WinSock 2.0 -- OpenSSL 0.9.8g 19 Oct 2007
[右] 正在连接到 192.168.1.186 -> IP=192.168.1.186 PORT=21
[右] 已连接到 192.168.1.186
[右] 421 Server is temporarily unavailable - please try again later.
[右] 连接失败
[右] 正在延迟 120 秒, 之后将尝试第 1 次重新连接




下面是以127.0.0.1连接的提示:

WinSock 2.0 -- OpenSSL 0.9.8g 19 Oct 2007
[右] 正在连接到 192.168.1.186 -> IP=192.168.1.186 PORT=21
[右] 已连接到 192.168.1.186
[右] 421 Server is temporarily unavailable - please try again later.
[右] 连接失败
[右] 正在延迟 120 秒, 之后将尝试第 1 次重新连接
[右] 已放弃重新尝试
[右] 正在连接到 127.0.0.1 -> IP=127.0.0.1 PORT=21
[右] 已连接到 127.0.0.1
[右] 220 Midapex Village FTP Server V2.1 ready.
[右] USER ftp
[右] 331 Password required for ftp
[右] PASS (隐藏)
[右] 230 User successfully logged in.
[右] SYST
[右] 215 UNIX Type: L8
[右] FEAT
[右] 211-Features:
[右] MDTM
[右] SIZE
[右] REST STREAM
[右] PASV
[右] 211 End
[右] PWD
[右] 257 "/" is current directory.
[右] TYPE A
[右] 200 ASCII transfer mode active.
[右] PASV
[右] 227 Entering Passive Mode(192,168,1,186,5,104).
[右] 正在打开数据连接 IP: 192.168.1.186 端口: 1384
[右] LIST -al
[右] 150 Opening ASCII mode data connection for directory list.
[右] 226 Transfer complete.
[右] 列表完成: 1 KB 于 1.03 秒 (1.6 KB/秒)

 回复 引用 查看   
#31楼2008-12-30 09:35 | xland      
i ' m waiting for you
 回复 引用 查看   
#32楼2008-12-31 08:19 | xland      
难道大哥放假过元旦去了????
 回复 引用 查看   
#33楼2009-01-04 18:46 | xland      
还没回来呐?
 回复 引用 查看   
#34楼2009-01-05 14:45 | xland      
再来看看 还没回来
 回复 引用   
#35楼2009-01-08 11:02 | lioue[未注册用户]
客户端传服务端.在传大文件时出现异步超时了.
 回复 引用 查看   
#36楼2009-01-10 22:33 | xland      
你也碰到问题了?
发奋自己研究协议
自己写一个

 回复 引用   
#37楼2009-01-14 15:11 | QQ:15524655[未注册用户]
@lioue
我也遇到这个问题。请楼主帮忙看看

 回复 引用   
#38楼2009-05-13 15:40 | ssss[未注册用户]
很好,谢谢!
 回复 引用   
#39楼2009-06-06 11:01 | neusoft tim[未注册用户]
樓主,我在linux上做內嵌ftp server時使用xsp運行沒有問題,但是使用apache部署運行的時候就出現問題。問題如下:
我是在Application_Start里啟動ftpserver,結果報以下錯誤:
System.Net.Sockets.SocketException: Access denied
at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x0006c] in /usr/src/packages/BUILD/mono-2.4/mcs/class/System/System.Net.Sockets/Socket.cs:2064
at Midapex.Net.Tcp.TcpServerBase`1[Midapex.Net.Ftp.FtpSession].OnStart () [0x00000]
at Midapex.Net.Ftp.FtpServer.OnStart () [0x00000]
at Midapex.StartableBase.Start () [0x00000]
懇請樓主指點下!謝謝!!

 回复 引用   
#40楼2009-07-23 16:44 | hymanyl[未注册用户]
多谢了先,下载下来学习一下。
 回复 引用   
#41楼2009-08-11 10:36 | ani[未注册用户]
楼主,看你的介绍后尝试运行了该服务器,可以运行,但在ie中用ftp:ftp用户登录后不能够删除含有中文名的嵌套子目录,删除时,服务器失去响应,呈现假死状态,IE端也挂了,失去响应,不知是何故?但删除英文名的嵌套目录却正常,请楼主和各楼层尝试,可能大家以前还没有发现此问题吧,请问楼主能给出解答吗?
 回复 引用   
#42楼2009-08-11 20:26 | 游乐场@yy[未注册用户]
上述问题我试了一下确实如此,问题就奇怪了,既然支持中文,但删中文名嵌套目录就出错,但删英文却没有问题,看来只有楼主才能给出答案了,呵呵。
 回复 引用   
#43楼2009-11-10 22:15 | depi[未注册用户]
public FtpResult(string result)
{
if (string.IsNullOrEmpty(result) || result.Length < 3)
throw new ArgumentOutOfRangeException();
//如果FTP的消息里面设置了中文欢迎词的话下面的语句就报错,有什么办法吗
code = int.Parse(result.Substring(0, 3));
param = result.Substring(3);
this.result = result;


}

//如果FTP主机的消息里面设置了中文欢迎词的话就报错,有什么办法吗
谢谢

 回复 引用 查看   
#44楼[楼主]2011-01-22 13:36 | 南桥一梦      
@depi
设置客户端的字符集与服务器一致即可解决。

 回复 引用 查看   
#45楼2011-11-04 15:41 | 小丿blog      
很好
标记一下