110,571
社区成员
发帖
与我相关
我的任务
分享
NetworkStream ns = tcpClientObj.GetStream();
FileStream fs = new FileStream(@"D:\sogou.exe", FileMode.Open);
int size = 0;//初始化读取的流量为0
long len = 0;//初始化已经读取的流量
while (len < fs.Length)
{
byte[] buffer = new byte[512];
size = fs.Read(buffer, 0, buffer.Length);
ns.Write(buffer, 0, size);
len += size;
//Pro((long)len);
}
fs.Flush();
ns.Flush();
int size = 0;
int len = 0;
NetworkStream ns = clientMem[Thread.CurrentThread.Name].GetStream();
if (ns != null)
{
string fileSavePath = "123.exe";
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write))
{
byte[] buffer = new byte[512];
while ((size = ns.Read(buffer, 0, buffer.Length)) > 0 || ns.DataAvailable == false)
{
fs.Write(buffer, 0, size);
len += size;
}
fs.Flush();
fs.Dispose();
fs.Close();
ns.Flush();
ns.Dispose();
ns.Close();
Thread.CurrentThread.Abort(); //(接收端是多线程,其实感觉没必要关闭,没办法了,只能把所有用到的都关闭,但还是提示占用)
return;
}
}
File.WriteAllBytes(path, bytes);
不可以吗?
/// <summary>
/// 发送文件
/// </summary>
/// <param name="path">文件路径</param>
public void File(string path)
{
try
{
TcpClient tcpC = new TcpClient();
tcpC.Connect(IPAddress.Parse(服务器IP),服务器端口);
NetworkStream netS = tcpC.GetStream();
string sFileName = Path.GetFileName(path);
using (NetworkStream ns = netS)
{
FileStream fs = new FileStream(path, FileMode.Open);
int size = 0;//初始化读取的流量为0
long len = 0;//初始化已经读取的流量
while (len < fs.Length)
{
byte[] buffer = new byte[512];
size = fs.Read(buffer, 0, buffer.Length);
ns.Write(buffer, 0, size);
len += size;
}
fs.Flush();
ns.Flush();
fs.Close();
ns.Close();
}
tcpC.Close();
netS.Dispose();
netS.Close();
}
catch
{
}
finally
{
}
}
-----------接收端代码
NetworkStream ns = clientMem[Thread.CurrentThread.Name].GetStream(); //获取属于这个线程的连接
if (ns != null)
{
string fileSavePath = "Files//" + sNewFileName;//获得用户保存文件的路径
//fileSavePath = "123.exe";
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write))
{
byte[] buffer = new byte[512];
while ((size = ns.Read(buffer, 0, buffer.Length)) > 0 || ns.DataAvailable == true)
{
fs.Write(buffer, 0, size);
len += size;
}
fs.Flush();
fs.Dispose();
fs.Close();
}
其实,核心解决,就在于原来发送端的连接没有断开,结果接收端一直认为还有数据,所以就一直在接收而占用。
string fileSavePath = "Files//" + sNewFileName;//获得用户保存文件的路径
fileSavePath = "123.exe";
using (FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write))
{
NetworkStream ns = clientMem[Thread.CurrentThread.Name].GetStream();
byte[] buffer = new byte[512];
while ((size = ns.Read(buffer, 0, buffer.Length)) > 0 || ns.DataAvailable == false)
{
fs.Write(buffer, 0, size);
len += size;
}
fs.Flush();
ns.Flush();
//fs.Dispose();
//fs.Close();
//ns.Dispose();
//ns.Close();
return;
便结果依旧,依然是 接收端不关闭,文件就被占用,只要接收端EXE一关闭 传过来这个文件就好用。