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(); 
			} 
		} 
	} 
}