请问有关C# socket接受文件的问题

服务器情(S)况:1、首先发送一个文件的长度给客户端(C),然后才发送文件。2、C接受情况:变接受边写入文件,用一个累计的变量来判断接受的数据长度是否小于或者等于发送过来... 服务器情(S)况:1、首先发送一个文件的长度给客户端(C),然后才发送文件。
2、C接受情况:变接受边写入文件,用一个累计的变量来判断接受的数据长度是否小于或者等于发送过来的文件长度而进行死循环接受文件

int recLength = 0;
//接受文件信息
while (true)
{

if (recLength < fileLength)
{
buff = new byte[1024*1024*5];
clisocket.Receive(buff);
writer.Write(buff,0,buff.Length);
recLength += buff.Length;
//writer.Flush();
}
else
{
timer1.Stop();
lstRecfile.Items.Add(lstFile.SelectedItem.ToString());
writer.Close();
// break;
return;
}
}

为什么我发送几百K的图片接受完成后是5M的。
buff = new byte[1024*1024*5];
clisocket.Receive(buff); writer.Write(buff,0,buff.Length);
难道接受buff的时候就算没有5M,那个buff都会硬性地给我的写文件流写入5M的东西么?
展开
 我来答
祚胤17
2010-01-10 · TA获得超过786个赞
知道大有可为答主
回答量:1149
采纳率:82%
帮助的人:264万
展开全部
using System.Sockes;
/*
System.Sockes命名空间了实现 Berkeley 套接字接口。通过这个类,我们可以实现网络计算机之间的消息传输和发送.而在我下面要讨论的这个议题里,我们将讨论的是用套节子实现文件的传输.这种方法有别于FTP协议实现的的文件传输方法,利用ftp的方法需要一个专门的服务器和客户端,无疑于我们要实现的点对点的文件传输太为复杂了一些。在这里,我们实现一个轻量级的方法来实现点对点的文件传输,这样就达到了intenet上任何两个计算机的文件共享。
在两台计算机传输文件之前,必需得先有一台计算机建立套节子连接并绑定一个固定得端口,并在这个端口侦听另外一台计算机的连接请求。
*/
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
socket.Blocking = true ;
IPEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080);
socket.Bind(computernode1);
socket.Listen(-1);
//当有其他的计算机发出连接请求的时候,被请求的计算机将对每一个连接请求分配一个线程,用于处理文件传输和其他服务。

while (true)
{
clientsock = socket.Accept();
if ( clientsock.Connected )
{
Thread tc = new Thread(new ThreadStart(listenclient));
tc.Start();
}
}
//下面的代码展示了listenclient方法是如何处理另外一台计算机发送过来的请求。首先并对发送过来的请求字符串作出判断,看看是何种请求,然后决定相应的处理方法。
void listenclient()
{
Socket sock = clientsock ;
try
{
while ( sock != null )
{
byte[] recs = new byte[32767];
int rcount = sock.Receive(recs,recs.Length,0) ;
string message = System.Text.Encoding.ASCII.GetString(recs) ;
//对message作出处理,解析处请求字符和参数存储在cmdList 中
execmd=cmdList[0];
sender = null ;
sender = new Byte[32767];
string parm1 = "";
//目录列举
if ( execmd == "LISTING" )
{
ListFiles(message);
continue ;
}
//文件传输
if ( execmd == "GETOK" )
{
cmd = "BEGINSEND " + filepath + " " + filesize ;
sender = new Byte[1024];
sender = Encoding.ASCII.GetBytes(cmd);
sock.Send(sender, sender.Length , 0 );
//转到文件下载处理
DownloadingFile(sock);
continue ;
}
}
}
catch(Exception Se)
{
string s = Se.Message;
Console.WriteLine(s);
}
}
//至此,基本的工作已经完成了,下面我们看看如何处理文件传输的。
while(rdby < total && nfs.CanWrite)
{
//从要传输的文件读取指定长度的数据
len =fin.Read(buffed,0,buffed.Length) ;
//将读取的数据发送到对应的计算机
nfs.Write(buffed, 0,len);
//增加已经发送的长度
rdby=rdby+len ;
}
从上面的代码可以看出是完成文件转换成FileStream 流,然后通过NetworkStream绑定对应的套节子,最后调用他的write方法发送到对应的计算机。
我们再看看接受端是如何接受传输过来的流,并且转换成文件的:
NetworkStream nfs = new NetworkStream(sock) ;
try
{
//一直循环直到指定的文件长度
while(rby < size)
{
byte[] buffer = new byte[1024] ;
//读取发送过来的文件流
int i = nfs.Read(buffer,0,buffer.Length) ;
fout.Write(buffer,0,(int)i) ;
rby=rby+i ;
}
fout.Close();
}
catch(Exception){}
/*
从上面可以看出接受与发送恰好是互为相反的过程,非常简单。
至此,单方向的文件传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就可以做到互相传输文件了。
*/
KaLaDa
2009-12-28 · 超过23用户采纳过TA的回答
知道答主
回答量:144
采纳率:0%
帮助的人:70万
展开全部
貌似你说的是对的,应该是你直接赋值给图片了5M空间,但是这个空间内只存在了几百k的内容。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
重典技术闲话
2009-12-30 · TA获得超过2173个赞
知道大有可为答主
回答量:2593
采纳率:0%
帮助的人:1158万
展开全部
是的,所以发送的时候不要用固定大小的数组
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式