请问如何实现局域网高速的文件传输功能·C#的·我自己写了个UDP的··只有140K啊·郁闷·人家MFC的·至少都是1M···有知道的吗?麻烦贴点代码出来学习下·谢谢
解决方案 »
- 求c# md5(Base64)加密方法。如123456加密码后的是LghTkEmsD2tbQ3fsIBRcBg==
- 是不是安装出问题了?
- 没事出来散分
- vlc-1.1.11二次开发输出窗体问题
- 2003 报表 会的帮个忙啊
- 急急急!在线等待!!!winForm中DataGrid显示的问题?
- vs2003打包问题(加入vj#)
- C#中的treeviews和数据库的关联,实在是急呀????各位大侠救救我呀?
- Σ 数组求和的问题
- 天啦~~~win2003+vs2003创建web application为什么老是提示操作访问权限不够?55555~~~~~~~~
- 怎样用C#实现一边播放一边录制
- 混合byte[]如何解析出来?就是byte[]里写入了int,string等
FTP 比较快!
起码几M
您说得对~那么您有这方面的示例吗?我确实很郁闷·这里没人给出一个答案·
我知道是自己的问题·可是问题出现主要是什么原因··不是.NET的问题~所以不应该怪IDE的封装·
局域网用FTP就可以了
局域网的传输·我不知道是怎么搞了··而且网上找到的局域网的C#代码·都只这么个速度···
包括LANMSG····
LANMSG的速度不止是140K/S这么慢吧!
然后吧传缓冲区修改……
默认是几百BYTE···
改成2KB比较好……
2.支持文件夹传输
3.支持断点续传。如果您所在的网络经常出现断网,那么选择文件速递小精灵传输文件是最合适了!
4.使用方便,可以自动列举出所在局域网的在线用户。另外,用户也可自行添加其他网段的用户。
5.可以实时监控每个任务的进展情况。
6.提供历史记录的功能
7.完全免费,无需安装
下载地址
http://www.xiaotv.com/down/send.rar
这里有个例子,可以看看
{ public class MessageType
{
public static string StringMessage = "string";
public static string FileMessage = "File";
}
public class AsySocketMessage
{
/// <summary>
/// 要发送消息的类型
/// </summary>
private string _messageType = "";
/// <summary>
/// 要发送文件的大小
/// </summary>
private int _messageLength = 0; /// <summary>
/// 发送文件的名称
/// </summary>
private string _fileName = ""; /// <summary>
/// 文件总大小
/// </summary>
private int _totalLength = 0; /// <summary>
/// 发送文件的类型
/// </summary>
public string MessageType
{
get
{
return _messageType;
}
set
{
_messageType = value;
}
}
/// <summary>
/// 发送文件的大小
/// </summary>
public int MessageLength
{
get
{
return _messageLength;
}
set
{
_messageLength = value;
}
} /// <summary>
/// 文件的名称
/// </summary>
public string FileName
{
get
{
return _fileName;
}
set
{
_fileName = value;
}
}
/// <summary>
/// 该传输文件的总的大小
/// </summary>
public int TotalLength
{
get
{
return _totalLength;
}
set
{
_totalLength = value;
}
}
/// <summary>
/// 无参数构造函数
/// </summary>
public AsySocketMessage()
{
} /// <summary>
/// 带有参数的构造函数
/// </summary>
/// <param name="messageType"></param>
public AsySocketMessage(string messageType)
{
try
{
string[] message = messageType.Split('-');
_messageType = message[0];
_messageLength = Convert.ToInt32(message[1]);
_fileName = message[2];
}
catch (Exception e)
{
throw new Exception("转换消息头部发生错误!");
}
} public override string ToString()
{
return _messageType + "-" + _messageLength.ToString() + "-" + _fileName;
}
}
}
/// 发送文件(发送文件的过程保证每次只发送50000字节,如果文件的大小大于50000的话就该函数就会自动将文件分块传输到远程接收端)
/// </summary>
/// <param name="fileName">要发送的文件的全路径</param>
public void SendFile(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
try
{
//发送文件之前首先要发送一个消息头部给远程接收端,该头部信息包含了接下来发送的
//消息的类型(字符串、文件),要发送的数据的大小、发送的文件的文件名(如果发送的是文件)
AsySocketMessage messagetype = new AsySocketMessage();
messagetype.MessageType = MessageType.FileMessage;
messagetype.MessageLength = (int)fs.Length;
//获取要发送文件的文件名
string[] splitName = fileName.Split('\\');
messagetype.FileName = splitName[splitName.Length - 1]; if (BeginSendBufferEvent != null)
{
BeginSendBufferEvent(this, messagetype);
}
//向远程接收端发送要发送文件的头部的信息
SendBuffer(Encoding.Default.GetBytes(messagetype.ToString())); int bytesSend = 0;
while (bytesSend < fs.Length)
{
//重新设置信号量
_sendEvent.Reset(); //下面操作为强制将文件分块,每次发送50000字节,如果不足50000字节的话就发送该字节数的字节
if (bytesSend + 50000 <= fs.Length)
{
byte[] sendbuffer = new byte[50000];
fs.Read(sendbuffer, 0, 50000);
_AsySocket.BeginSend(sendbuffer, 0, 50000, 0, new AsyncCallback(SendMessageCallBack), _AsySocket);
}
else
{
byte[] sendbuffer = new byte[fs.Length - bytesSend];
fs.Read(sendbuffer, 0, sendbuffer.Length);
_AsySocket.BeginSend(sendbuffer, 0, sendbuffer.Length, 0, new AsyncCallback(SendMessageCallBack), _AsySocket);
}
bytesSend += 50000;
Thread.Sleep(10); if (SendBufferEvent != null)
{
try
{
AsySocketMessage message = new AsySocketMessage();
message.FileName = messagetype.FileName;
message.MessageType = messagetype.MessageType;
message.MessageLength = bytesSend <= fs.Length ? bytesSend : (int)fs.Length;
SendBufferEvent(this, message);
}
catch
{
;
}
}
//启用下面的方法在信道被占用时候会出现程序强制琐死的情况
//通过信号量控制将发送线程强制挂起
// _sendEvent.WaitOne();
}
}
catch (IOException e)
{
Console.WriteLine(e.Message);
_recvString = "";
_isRecvHeadMessage = false;
_headMessage = null;
_recvLength = 0;
if (SocketErrorEvent != null)
{
SocketErrorEvent(this, new AsyTcpSocketEventArgs("发送文件过程中出现错误!"));
}
else
{
throw new Exception("发送文件过程中出现错误!");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
_recvString = "";
_isRecvHeadMessage = false;
_headMessage = null;
_recvLength = 0;
if (SocketErrorEvent != null)
{
SocketErrorEvent(this, new AsyTcpSocketEventArgs("发送文件过程中出现错误!"));
}
else
{
throw new Exception("发送文件过程中出现错误!");
}
}
finally
{
fs.Close();
}
}
1.类似于FTP协议,服务端开辟两个端口,并持续对这两个端口侦听:一个用于接收字符串,类似于FTP的控制端口,它接收各种命令(接收或发送文件);一个用于传输数据,也就是发送和接收文件。
2。服务端只开辟一个端口,用于接收字符串,为控制端口。当接到请求之后,根据请求内容在客户端开辟一个端口专用于文件传输,并在传输结束后关闭端口。 这样应该能节省很多带宽哈。。建议试试。
如果不会请参照例子。。http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx
2M的速度是点对点的速度··加入几百个客户端对服务器·那会怎么样?飞鸽传书速度的五分之一啊·
我就不相信C#的效率比C++的慢这么多···所以请大家一起来帮帮忙啊···
我觉得肯定是我的能力问题··
希望能有高手写个更强悍的出来!@
现在我只是想知道C#的局域网通信 基于TCP/IP的 的速度最高能达到多少...100M的局域网内·至于说多客户端通信··就是多线程的问题了·现在就讨论点对点 怎么能提高通信的速度··怎么来提高速度··以及代码的实现··这个是我目前最需要的··
udp的确比tcp传输更快,但是传音频视频这类对包顺序不敏感对丢包不敏感的还行,文件,还是tcp保险
C#这么慢肯定是你代码有问题
手头没代码,不过我觉得随便找本C#网络方面的教程都有相关的demo,msdn上应该也有例子...