asp.net实现文件传输 类似QQ的文件收发功能!请问能实现吗?给点思路最好!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在两台计算机传输文件之前,必需得先有一台计算机建立套节子连接并绑定一个固定得端口,并在这个端口侦听另外一台计算机的连接请求。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() ;从上面可以看出接受与发送恰好是互为相反的过程,非常简单。//取得预保存的文件名 string fileName="test.rar"; //远程主机 string hostName=TextBoxHost.Text.Trim(); //端口 int port=80; //得到主机信息 IPHostEntry ipInfo=Dns.GetHostByName(hostName); //取得IPAddress[] IPAddress[] ipAddr=ipInfo.AddressList; //得到ip IPAddress ip=ipAddr[0]; //组合出远程终结点 IPEndPoint hostEP=new IPEndPoint(ip,port); //创建Socket 实例 Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try { //尝试连接 socket.Connect(hostEP); } catch(Exception se) { LeixunCMS.Common.MessageBox.Show(this.Page,"连接错误"+se.Message);} //对message作出处理,解析处请求字符和参数存储在cmdList 中具体的怎么处理?发送方发送消息要发送文件,对方有两个选择,拒绝或接受!关键是怎么实现这个!! 关于GridView中如何传参数的过程 80070005错误! 数据库方面的asp 请大侠们帮忙解决 一个下载统计问题.... 在一个页面中加入一个自定义控件后,button事件无效了 Forms验证,如何实现在同一个项目中,2个文件夹下,在不同的文件夹下需要验证身份时,自动跳到所在文件(不一定是哪个文件夹)下的验证那 存储过程问题,请问如何用asp.net来调用存储过程取出某个表的数据。谢谢!我只会插入和修改的修改过程。 APS.NET中javascript的验证弹框问题 用程序上传视频到指定视频网站上 求一份.net论坛源码!!! 自己总结了几个关于发布的问题,求好心人来看看!!
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() ;从上面可以看出接受与发送恰好是互为相反的过程,非常简单。//取得预保存的文件名
string fileName="test.rar";
//远程主机
string hostName=TextBoxHost.Text.Trim();
//端口
int port=80;
//得到主机信息
IPHostEntry ipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[] ipAddr=ipInfo.AddressList;
//得到ip
IPAddress ip=ipAddr[0];
//组合出远程终结点
IPEndPoint hostEP=new IPEndPoint(ip,port);
//创建Socket 实例
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
//尝试连接
socket.Connect(hostEP);
}
catch(Exception se)
{
LeixunCMS.Common.MessageBox.Show(this.Page,"连接错误"+se.Message);}
具体的怎么处理?发送方发送消息要发送文件,对方有两个选择,拒绝或接受!关键是怎么实现这个!!