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() ;
从上面可以看出接受与发送恰好是互为相反的过程,非常简单。
//取得预保存的文件名
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);
}
新闻热点
疑难解答