700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C#文件流传输[类似于QQ][引]

C#文件流传输[类似于QQ][引]

时间:2018-08-25 23:06:00

相关推荐

C#文件流传输[类似于QQ][引]

这几天一直想写一个类似QQ文件发送的东西,上网找了一些资料,都不是很理想,下面我把我的思路和基本实现代码说下。

为了把问题说清楚,把一些变量都直接附值了,并没有通过输入附值

private string path = "F:\\SmartMovie.EXE";//要发送的文件

private Socket s;

private void listen()

{

string ip = "127.0.0.1";//远程IP这里定义为自己的机器

IPAddress[] ih = Dns.GetHostAddresses(ip);//获得IP列表

IPAddress newip = ih[0];//获取IP地址

int port = 6789;//定义端口

IPEndPoint Conncet = new IPEndPoint(newip, port);//构造结点

s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化socket

try

{

s.Connect(Conncet);//连接远程服务器

if (s.Connected)//如果连接成功 s.Connected则为true否则为 false

{

Console.WriteLine("连接成功");

Thread t = new Thread(new ThreadStart(set));//创建进程

t.Start();//开始进程

Console.WriteLine("发送完毕")

}

}

catch(NullReferenceException e)

{

Console.WriteLine("{0}",e);

}

private void set()//创建set函数

{

Console.WriteLine("开始发送数据");

byte[] b = new byte[10000000];//创建文件缓冲区,这里可以认为文件的最大值

FileStream file = File.Open(path, FileMode.Open,FileAccess.Read);//创建文件流

int start = 0;

int end = (int)file.Length;//获取文件长度 文件传送如果有需要超过int的范围估计就要改写FileStream类了

try

{

while (end != 0)

{

int count = file.Read(b, start, end); //把数据写进流

start += count;

end -= count;

}

while (start != 0)

{

int n = s.Send(b, end, start, SocketFlags.None);//用Socket的Send方法发送流

end += n;

start -= n;

}

file.Close();//关闭文件流

s.Close();//关闭Socket

}

catch (NullReferenceException e)

{

Console.WriteLine("{0}", e);

}

}

这样文件发送的模型就实现了

接下去实现文件的接收,首先要确定对方发送文件的长度,其实上面的那段还要加入发送文件长度的功能,实现很简单,就是发送int变量end ,然后要求接收代码返回一个Boolean确定是否发送,这里为了更简明的说清楚原理并没有实现

private void get()

{

string path = "G:\\da.exe";//接收的文件

FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);//写入文件流

TcpListener listen = new TcpListener(6789);//监听端口

Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//定义Socket并初始化

try

{

listen.Start();//开始监听

s1 = listen.AcceptSocket();//获取Socket连接

byte[] data = new byte[10000000];//定义缓冲区

int longer = data.Length;

int start = 0;

int mid = 0;

if (s1.Connected)//确定连接

{

Console.WriteLine("连接成功");

int count = s1.Receive(data, start, longer, SocketFlags.None);//把接收到的byte存入缓冲区

mid += count;

longer -= mid;

while (count != 0)

{

count = s1.Receive(data, mid, longer, SocketFlags.None);

mid += count;

longer -= mid;

}

file.Write(data, 0, 1214134);//写入文件,1214134为文件大小,可以用socket发送获得,代码前面已经说明。

s1.Close();

file.Close();

}

}

catch(NullReferenceException e)

{

Console.WriteLine("{0}",e);

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。