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()
从上面可以看出接受与发送恰好是互为相反的过程,非常简单。
至此,单方向的文件传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就可以做到互相传输文件了。
服务器端(发送李卖文件):首先打开文件【fopen】,用rb方式打开,既可以发送文本文件,也可以发送二进制文件,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充服务器的慧侍地址,即填充sockaddr_in结构,然后进行绑定【bind】,设置套接字为监听套接字【listen】,接收连接【accept】,至此服务器阻塞,等待客户端的连接。客户端(接收文件):首先打开文件【fopen】,用wb方式打开,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充客户端的地址,即填充sockaddr_in结构,然后进行绑定【bind】,再填充服务器的地址结构,然后调用【connect】进行连接,当连接成功后,第一阶段的工作便结束了。
第二阶段,发送文件。
服务器端:使用循环while,结束条件是(!feof(fp)),fp是文件指针,feof检测当前的文件读取指针是否到达文件尾部,若到达了就返回真,否则返回假。然后在循环内部依次调用【fread】、【send】进行发送。这里有一个问题需要注意,调用fread的时候有两个参数是要每次读多少字节和读多少次,将第一个设置为1,将第二个设置为缓冲区的大小,用一个变量记录实际读到多少字节,即【fread】的返回值,然后将其传递给【send】,就可以实现发送文件了,在发送完成后断开连接【closesocket】,关闭文件【fclose】。
客户端:使用while死循环,调用【recv】接收文件,【fwrite】写入文件,这里也有个和上面类似的问题,就是要将recv的返回值传递给fwrite的第三个参数,哪碧逗即受到了多少字节,就向文件中写多少字节。当recv返回值为0时(连接断开时)退出循环,【closesocket】关闭套接字,调用【fclose】关闭文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)