Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2015, 05:32   #1
1L1dan
 
Регистрация: 04.03.2013
Сообщений: 4
По умолчанию Мультипоточный сервер C#

Доброго времени суток!
Имеется следующий код мультипоточного сервера и клиента.
Сервер:
Код:
namespace Server_Test
{
    class Server
    {
        static void Main(string[] args)
        {
            Server serv = new Server();
        }
        private TcpListener listener { get; set; }
        private NetworkStream stream { get; set; }
 
        public Server()
        {
            listener = new TcpListener(IPAddress.Parse("192.168.1.2"), 5052);
            listener.Start();
            new Thread(ListenForClients).Start();
        }
 
        private void ListenForClients()
        {
            while (true)
            {
                TcpClient client = this.listener.AcceptTcpClient();
                new Thread(HandleClient).Start(client);
            }
        }
 
        private void HandleClient(object tcpClient)
        {
            TcpClient client = (TcpClient)tcpClient;
            while (client.Connected)
            {
                
                Recieve(client);
            }
        }
 
        private void Recieve(TcpClient client)
        {
            byte[] buffer = new byte[client.ReceiveBufferSize];
            Array.Clear(buffer, 0, buffer.Length);
            try
            {
                stream = client.GetStream();
                stream.Flush();
                int bytesRead = stream.Read(buffer, 0, 12);
                if (bytesRead == 0) return;
 
                ushort id = BitConverter.ToUInt16(buffer, 0);
                long len = BitConverter.ToInt64(buffer, 2);
                ushort nameLen = BitConverter.ToUInt16(buffer, 10);
                stream.Read(buffer, 0, nameLen);
                string fileName = Encoding.UTF8.GetString(buffer, 0, nameLen);
 
                if (id == 1)
                {
                    using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        int recieved = 0;
                        while (recieved < len)
                        {
                            bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
                            recieved += bytesRead;
                            writer.Write(buffer, 0, bytesRead);
                            Console.WriteLine("{0} bytes recieved.", recieved);
                        }
                    }
                    Console.WriteLine("File length: {0}", len);
                    Console.WriteLine("File Name: {0}", fileName);
                    Console.WriteLine("Recieved!");
                    stream.Flush();
                    Array.Clear(buffer, 0, buffer.Length);
                }
                else
                {
                    Console.WriteLine(fileName);
                }
            }
            catch (Exception ex)
            {
 
                stream.Close();
                client.Close();
                Console.WriteLine(ex);
            }
            finally
            {
                stream.Flush();
                Array.Clear(buffer, 0, buffer.Length);
            }
        }
    }
}
Клиент:
Код:
namespace ClientTest
{
internal class Program
{
private static TcpClient client;
private static NetworkStream stream;
private static void Main(string[] args)
{
string temp;
client = new TcpClient("192.168.1.2",5052);
//stream = client.GetStream();
Console.WriteLine(client.SendBufferSize);
/*while ((temp = Console.ReadLine()) != "exit")
{
Send(temp);
}*/
 
Thread one=new Thread(()=> SendFile(new FileInfo(@"1.doc")));
one.Start();
Thread two=new Thread(()=> SendFile(new FileInfo(@"2.docx")));
two.Start();
// Console.ReadKey(true);
}
 
public static void SendFile(FileInfo file)
{
stream = client.GetStream();
stream.Flush();
byte[] id = BitConverter.GetBytes((ushort)1);
byte[] size = BitConverter.GetBytes(file.Length);
byte[] fileName = Encoding.UTF8.GetBytes(file.Name);
byte[] fileNameLength = BitConverter.GetBytes((ushort)fileName.Length);
byte[] fileInfo = new byte[12 + fileName.Length];
 
id.CopyTo(fileInfo, 0);
size.CopyTo(fileInfo, 2);
fileNameLength.CopyTo(fileInfo, 10);
fileName.CopyTo(fileInfo, 12);
 
stream.Write(fileInfo, 0, fileInfo.Length); //Размер файла, имя
 
byte[] buffer = new byte[1024 * 32];
int count;
 
long sended = 0;
 
using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open))
while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
stream.Write(buffer, 0, count);
sended += count;
Console.WriteLine("{0} bytes sended.", sended);
}
stream.Flush();
Array.Clear(buffer, 0, buffer.Length);
}
}
Проблема состоит в следующем:
При попытке передачи с клиента на сервер более одного файла, код не работает.
Какие исправления нужно внести в код, чтобы клиент мог передавать сразу несколько файлов, а сервер-принимать их?
Заранее спасибо за ответы!
1L1dan вне форума Ответить с цитированием
Старый 29.05.2015, 08:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Глупый вопрос: FTP попробовать не хочешь?
http://www.programmersforum.ru/showthread.php?t=62441

Или это курсач?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер Баграт C/C++ Сетевое программирование 0 28.09.2012 00:28
Сервер atenon Свободное общение 4 14.01.2011 07:55
CS сервер DRAP707 Общие вопросы C/C++ 1 16.04.2010 12:36
CS Сервер DRAP707 Свободное общение 0 15.04.2010 15:43