www.pudn.com > FileTranslate.rar > FileSender.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace TransSender
{
class FileSender
{
private int startPortNo;
private int bufferSize;
private int threadCount;
private string hostName;
private string filePath;
private Block[] blocksPerThread;
public Thread[] workers;
private Sender[] senders;
private TcpClient tcpClient;
private Int64 fileLength;
private string fileName;
private Int64 blockCountPerThread;
public FileSender(int startPortNo, int bufferSize, int threadCount, string hostName, string filePath)
{
this.startPortNo = startPortNo;
this.bufferSize = bufferSize;
this.threadCount = threadCount;
this.hostName = hostName;
this.filePath = filePath;
FileInfo fi = new FileInfo(filePath);
this.fileName = fi.Name;
this.fileLength = fi.Length;
Int64 blocks = (fi.Length / bufferSize + (fi.Length % bufferSize == 0 ? 0 : 1));
blockCountPerThread = blocks / threadCount;
blocksPerThread = new Block[threadCount];
workers = new Thread[threadCount];
senders = new Sender[threadCount];
tcpClient = new TcpClient();
}
public void beforeSend()
{
tcpClient.Connect(hostName, startPortNo);
BinaryWriter writer = new BinaryWriter(tcpClient.GetStream());
writer.Write(fileName);
writer.Write(fileLength);
writer.Write(startPortNo + 1);
writer.Write(threadCount);
TcpListener tcpListener = new TcpListener(IPAddress.Any, startPortNo);
BinaryReader reader = new BinaryReader(tcpClient.GetStream());
Boolean res=reader.ReadBoolean();
Console.WriteLine(res);
Thread.Sleep(5000);
}
public void startSend()
{
beforeSend();
int iIndex;
for (iIndex = 0; iIndex < threadCount; ++iIndex)
{
blocksPerThread[iIndex] = new Block(blockCountPerThread * iIndex, blockCountPerThread * (iIndex + 1));
Int64 sendLength = 0;
if (iIndex == 0)
sendLength = blockCountPerThread * bufferSize;
else
sendLength = (blocksPerThread[iIndex].endBlockNo - blocksPerThread[iIndex].startBlockNo) * bufferSize;
senders[iIndex] = new Sender(filePath, hostName, startPortNo + 1 + iIndex, bufferSize, iIndex, sendLength, blocksPerThread[iIndex]);
workers[iIndex] = new Thread(new ThreadStart(senders[iIndex].sendFile));
workers[iIndex].IsBackground = true;
workers[iIndex].Start();
}
}
}
}