c# socket 传输文件
我的大体思路有两个(参考网上的资料)
----------------------
(1) 个人认为效率比较低
连接..
发送第一个字节块...
等待确认...(接收确认信息)
确认
发送第二个字节块...
等待确认...
确认
发送第三个.....
....
(2)个人认为效率比较高
发送端一直写入网络流
接收端一直读取网络流
----------------------
我在每个字节块的前面加入了一个int型的变量,它表示每次发送文件数据的长度
我根据思路(2)写了代码
如下
----------------------
接收端
private void Listener() //开始监听传输请求
{
IPHostEntry ipHostInfo =Dns.Resolve(System.Net.Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
this._ls =new TcpListener (ipAddress,6688);
this._ls .Start ();
while(true)
{
Socket socket=this._ls .AcceptSocket ();
this.txtConnect .Text =socket.RemoteEndPoint .ToString ();
Receive(socket); //调用接受文件函数
}
}
//我在每个字节块的前面加入了一个int型的变量,它表示每次发送文件数据的长度
private void Receive(Socket socket) //接受文件函数
{
NetworkStream ns = new NetworkStream(socket);
FileStream fs = new FileStream("c:\\file.txt", FileMode.OpenOrCreate);
bool isRead = true;
while (isRead)
{
int count = ns.Read(this._receiveBuf, 0, this._receiveBuf.Length);
int datanum = 0;
datanum = BitConverter.ToInt32(this._receiveBuf, 0);
if (datanum > 0) //如果传输的文件字节数>0 证明还有数据没有传输完
{
fs.Write(this._receiveBuf, 4, datanum);
fs.Flush();
}
else //datanum = 0 ,文件发送完毕
{
isRead = false;
}
}
this.txtFile.Text = "文件传输成功";
fs.Close();
}----------------------
发送端
private void btSend_Click(object sender, System.EventArgs e) //点击按钮后开始传输
{
if (this._isConnect)
{
_ns = _tc.GetStream();
string path = this.txtPath.Text.Trim();
FileStream fs = new FileStream(path, FileMode.Open);
int sendCount = 0;
byte[] countbuffer = null;
byte[] clientbuffer = new byte[1004];
while (sendCount < fs.Length && _ns.CanWrite)
{
int count = fs.Read(_sendBuf, 0, _sendBuf.Length); //从文件中读出数据
countbuffer = BitConverter.GetBytes(count); //表示每次读出了多少字节数
countbuffer.CopyTo(clientbuffer,0); //将count加入数组首部
_sendBuf.CopyTo(clientbuffer, 4);
this._ns.Write(clientbuffer, 0, 4 + count); //写入网络流
sendCount += count;
}
countbuffer = BitConverter.GetBytes(0); //发送文件完后,读出字节数为0
this._ns.Write(countbuffer, 0, countbuffer.Length);
_ns.Close();
fs.Close();
}
}
----------------------
我发现有时能够成功,有时却陷入死循环,比如我传输2k的txt,结果很长时间都没有停止,我中断后发现生成了200M的txt
实在搞不懂是为什么,请大家帮我分析分析.
-------------------------------
关于思路(1)
我不会控制socket和相对应的networkstream
比如说发送端发送数据后,要等待接收端的确认信息
怎样让发送端停止发送数据来等待确认信息
接收到后又怎样重新发送数据
说简单一点就是发送端和接收端有序的操作网络流的问题
请大家多多指点
-----------------------------------
最后的问题:您觉得在socket上传输大文件时,如何能提高传输的效率?
networkstream的同步异步操作是怎么回事?能不能跟我说说他们的区别,最好来一个实例(beginread中的AsyncCallback asyncCallback到底是什么东西)
问了好多问题,可是我没有多少分给大家觉得很惭愧(等我有份了一定补给大家),但是我会衷心的谢谢大家
我的mail:6233843@gmail.com 如果有code的话您可以mail我
再一次谢谢大家
相关推荐
C# Socket实现大文件分包传输
C# Socket实现大文件的分包上传。基本原理:添加客户端缓存,计算上传文件的字节,计算包的数量 ,计算最后一个包的字节。
C#基于Socket的TCP文件传输实战详解
在 C# 中,网络编程主要依托于两个核心命名空间:System.Net和。这两个命名空间分工明确,协同工作以实现完整的网络通信功能。System.Net提供了高层抽象接口,如IPAddressDnsWebClient等,用于处理 IP 地址解析、域名查询、HTTP 请求等任务。则专注于底层套接字操作,直接封装了操作系统提供的 socket API,允许开发者控制连接建立、数据收发、端口绑定等行为。
C#网络编程:Socket文件传输技术解析与实现
本文还有配套的精品资源,点击获取 简介:本文深入探讨了Socket编程在C#中的应用,特别是在文件传输方面的实践。首先介绍了Socket的基础概念和在C#中的实现方式。接着详细解析了通过Socket进行文件传输的关键步骤,包括服务器端和客户端的设置、文件分块处理、数据传输以及错误处理和连接关闭。文章还提到了优化文件传输性能的异步I/O技术,并强调了正确处理二进制数据的重要性...
C#网络编程:深入Socket通信与文件传输
网络编程是计算机程序设计领域的一个重要分支,旨在通过计算机网络实现数据的交换与信息共享。C#作为一种现代的、面向对象的编程语言,提供了丰富的网络编程接口,使得开发者能够相对容易地创建网络通信应用。协议(Protocol)是一组规则和约定,用于在网络环境中实现高效、可靠的数据通信。在自定义文件传输协议时,首先需要考虑的是协议的结构与层次。协议的结构通常由以下几个部分组成:头部信息(Header):包含协议版本、控制字段、数据长度、校验信息等,用于描述后续数据的有效载荷信息。
C# socket TCP 大文件传输同时实现断点续传
本程序是自己为公司服务器备份文件迁移写的一个基于socket TCP协议的大文件传输应用程序。代码实现了基本流程,后期还有更改和优化。先把前期demo上传以流自己以后学习。如大家有需要可以下载一起探讨。


