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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2014, 17:28   #1
Артур30.05
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 13
Восклицание Клиент - сервер

Есть сервер, на который коннектится клиент, всё отлично, всё работает. Потом клиенту предлагается ввести путь к файлу, который передастся на сервер. Клиент вводит путь жмет Enter и сервер так и не дожидается файла от клиента, а консольное окно клиента закрывается. HELP Pleas!
Код:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Threading;

public class UdpFileServer
{   //Информация о файле
    [Serializable]
    public class FileDetails
    {
        public string FILETYPE = "";
        public long FILESIZE = 0;
    }

    private static FileDetails fileDet = new FileDetails();

    //Поля, связанные с UdpClient
    //private static IPAddress remoteIPAddress;
    private const int remotePort = 9050;
    private static UdpClient sender = new UdpClient();
    private static IPEndPoint endPoint;
    
    private static FileStream fs;
    
    [STAThread]
        static void Main(string[] args)
        {
            try
            {
                byte[] data = new byte[1024];
                string input, stringData;

                //Получаем удаленный IP-адрес и создаем IPEndPoint
                Console.WriteLine("Введите IP-адрес");
                string addr = Console.ReadLine();
                //remoteIPAddress = IPAddress.Parse(Console.ReadLine().ToString());
                //endPoint = new IPEndPoint(remoteIPAddress, remotePort);
                

                UdpClient server = new UdpClient(addr, 9050);
                IPEndPoint sender1 = new IPEndPoint(IPAddress.Any, 0);

                string welcome = "Клиент подключился";
                data = Encoding.UTF8.GetBytes(welcome);
                server.Send(data, data.Length);

                data = server.Receive(ref sender1);

                Console.Write("Сообщение принято от {0}: ", sender1.ToString());
                stringData = Encoding.UTF8.GetString(data, 0, data.Length);
                //Console.WriteLine(stringData);

                //Получаем путь файла и его размер
                Console.WriteLine("Введите путь к файлу");
                fs = new FileStream(@Console.ReadLine().ToString(), FileMode.Open, FileAccess.Read);

                if (fs.Length > 8192)
                {
                    Console.Write("Файл должен весить меньше 8кБ");
                    sender.Close();
                    fs.Close();
                    return;
                }

                //Отправляем информацию о файле
                SendFileInfo();

                //Ждем 2 секунды
                Thread.Sleep(2000);

                //Отправляем сам файл
                SendFile();

                Console.ReadLine();
            }
            catch (Exception eR)
            {
                Console.WriteLine(eR.ToString());
            }
        }
    public static void SendFileInfo()
    {
        //Получаем тип и расширение файла
        fileDet.FILETYPE = fs.Name.Substring((int)fs.Name.Length - 3, 3);

        //Получаем длину файла
        fileDet.FILESIZE = fs.Length;

        XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails));
        MemoryStream stream = new MemoryStream();

        //Сериализуем объект
        fileSerializer.Serialize(stream, fileDet);

        //Считываем поток в байты
        stream.Position = 0;
        byte[] bytes = new Byte[stream.Length];
        stream.Read(bytes, 0, Convert.ToInt32(stream.Length));

        Console.WriteLine("Отправка деталей файла...");

        //Отправляем информацию о файле
        sender.Send(bytes, bytes.Length, endPoint);
        stream.Close();
    }

    private static void SendFile()
    {
        //Создаем файловый поток и переводим его в байты
        Byte[] bytes = new Byte[fs.Length];
        fs.Read(bytes, 0, bytes.Length);

        Console.WriteLine("Отправка файла размером " + fs.Length + " байт");
        try
        {
            //Отправляем файл
            sender.Send(bytes, bytes.Length, endPoint);
        }
        catch (Exception eR)
        {
            Console.WriteLine(eR.ToString());        
        }
        finally
        {
            //Закрываем соединение и очищаем поток
            fs.Close();
            sender.Close();
        }
        Console.WriteLine("Файл успешно отправлен");
        Console.Read();
        }
    }
Артур30.05 вне форума Ответить с цитированием
Старый 10.11.2014, 18:29   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что за сервер? Где его исходник?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.11.2014, 18:38   #3
Артур30.05
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что за сервер? Где его исходник?
Вот
Код:
using System;
using System.IO;
using System.Net;
using System.Diagnostics;
using System.Net.Sockets;
using System.Xml.Serialization;
using System.Text;

public class UdpFileClient
{
    //Детали файла
    [Serializable]
    public class FileDetails
    {
        public string FILETYPE = "";
        public long FILESIZE = 0;
    }
    
    private static FileDetails fileDet;

    //Поля, связанные с UdpClient
    private static int localPort = 9050;
    private static UdpClient receivingUdpClient = new UdpClient(localPort);
    private static IPEndPoint RemoteIpEndPoint = null;

    private static FileStream fs;
    private static Byte[] receiveBytes = new Byte[0];

    [STAThread]

    static void Main(string[] args)
    {
        int recv;
        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
        Socket SrvSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        SrvSock.Bind(ipep);
        Console.WriteLine("Ожидание клиента...");
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint Remote = (EndPoint)(sender);
        recv = SrvSock.ReceiveFrom(data, ref Remote);
        Console.Write("Сообщение получено от {0}: ", Remote.ToString());
        Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));
        string welcome = "Подкючение к серверу успешно!";
        data = Encoding.UTF8.GetBytes(welcome);
        SrvSock.SendTo(data, data.Length, SocketFlags.None, Remote);
        //Получаем информацию о файле
        GetFileDetails();
        //Получаем файл
        ReceiveFile();
    }
    
    private static void GetFileDetails()
    {
        while (true)
        {
            try
        {
            Console.WriteLine("----------Ожидание информации о файле----------");

            //Получаем информацию о файле
            receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
            Console.WriteLine("Информация о файле получена");

            XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails));
            MemoryStream stream1 = new MemoryStream();

            //Считываем информацию о файле
            stream1.Write(receiveBytes, 0, receiveBytes.Length);
            stream1.Position = 0;

            //Вызываем метод Deserialize
            fileDet = (FileDetails)fileSerializer.Deserialize(stream1);
            Console.WriteLine("Получен файл типа ." + fileDet.FILETYPE +
                "имеющий размер" + fileDet.FILESIZE.ToString() + "байт");
        }
        catch (Exception eR)
        {
            Console.WriteLine(eR.ToString());
        }
    }
    }
    public static void ReceiveFile()
    {
        try
        {
            Console.WriteLine("----------Ожидайте получение файла----------");

            //Получаем файл
            receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);

            //Преобразуем и отображаем данные
            Console.WriteLine("-----Файл получен-----");

            //Создаем временный файл с полученным расширением
            fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
            fs.Write(receiveBytes, 0, receiveBytes.Length);

            Console.WriteLine("---Файл сохранен---");
            Console.WriteLine("--Открытие файла--");

            //Открываем файл связанной с ним программой
            Process.Start(fs.Name);
        }
        catch (Exception eR)
        {
            Console.WriteLine(eR.ToString());
        }
        finally
        {
            fs.Close();
            receivingUdpClient.Close();
            Console.Read();
        }
        }
        
    }
Артур30.05 вне форума Ответить с цитированием
Старый 10.11.2014, 19:13   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А чего первый называется UdpFileServer, а второй UdpFileClient? Вроде ж наоборот.

Цитата:
консольное окно клиента закрывается
Наверно Exception выпадает. Запускайте обоих в режиме отладки или поставьте Console.ReadLine после try catch.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.11.2014, 19:41   #5
Артур30.05
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что за сервер? Где его исходник?
Я вот новый сервер с клиентом сделал. Посмотрите пожалуйста, так то должен работать, но что-то не рубит
Сервер
Код:
using System;
using System.IO;
using System.Net;
using System.Diagnostics;
using System.Net.Sockets;
using System.Text;
using System.Xml.Serialization;
public class UdpServer
{
    [Serializable]
    public class FileDetails
    {
        public string FILETYPE = "";
        public long FILESIZE = 0;
    }
    private static FileDetails fileDet;
    private static UdpClient receivingUdpClient = new UdpClient();
    private static IPEndPoint RemoteIpEndPoint = null;
    private static FileStream fs;
    private static Byte[] receiveBytes = new Byte[0];
    [STAThread]
    static void Main(string[] args)
    {
        int recv;
        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
        Socket SrvSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        SrvSock.Bind(ipep);
        Console.WriteLine("Ожидаем соединения с клиентом...");
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint Remote = (EndPoint)(sender);
        recv = SrvSock.ReceiveFrom(data, ref Remote);
        Console.Write("Сообщение получено от {0}: ", Remote.ToString());
        Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));
        string welcome = "Подключение к серверу выполнено";
        data = Encoding.UTF8.GetBytes(welcome);
        SrvSock.SendTo(data, data.Length, SocketFlags.None, Remote);
        ReceiveFile();            
    }
    public static void ReceiveFile()
    {
        try
        {
            while (true)
            {
                Console.WriteLine("---**Получение файла**---");
                receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                Console.WriteLine("Файл получен");
                fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                fs.Write(receiveBytes, 0, receiveBytes.Length);
                Console.WriteLine("Файл сохранен");
                Console.WriteLine("Открытие файла");
                Process.Start(fs.Name);
            }
        }
        catch (Exception eR)
        {
            Console.WriteLine(eR.ToString());
        }
        finally
        {
            fs.Close();
            receivingUdpClient.Close();
            Console.Read();
        }
    }
Артур30.05 вне форума Ответить с цитированием
Старый 10.11.2014, 19:42   #6
Артур30.05
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 13
По умолчанию

Клиент
Код:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Threading;
using System.Text;
public class UdpFileClient
{
    [Serializable]
    public class FileDetails
    {
        public string FILETYPE = "";
        public long FILESIZE = 0;
    }
    private static UdpClient sender = new UdpClient();
    private static IPEndPoint endPoint;
    private static FileStream fs;
    [STAThread]
    static void Main(string[] args)
    {
        try
        {
            byte[] data = new byte[1024];
            string input, stringData;
            Console.WriteLine("Введите удаленный IP-адрес");
            string addr = Console.ReadLine();
            if (addr == "") addr = "127.0.0.1";
            UdpClient server = new UdpClient(addr, 9050);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            string welcome = "Клиент подключился";
            data = Encoding.UTF8.GetBytes(welcome);
            server.Send(data, data.Length);
            data = server.Receive(ref sender);
            Console.Write("Сообщение принято от {0}: ", sender.ToString());
            stringData = Encoding.UTF8.GetString(data, 0, data.Length);
            Console.WriteLine(stringData);
            while (true)
            {
                Console.WriteLine("Введите путь к файлу и его имя: ");
                fs = new FileStream(@Console.ReadLine().ToString(), FileMode.Open, FileAccess.Read);
                if (fs.Length > 8192)
                {
                    Console.Write("Файл должен весить меньше 8кБ");
                    fs.Close();
                    return;
                }
                SendFile();
                Console.ReadLine();
            }
        }
            catch (Exception eR)
            {
                Console.WriteLine(eR.ToString());
            }
    }
        private static void SendFile()
        {
            Byte[] bytes = new Byte[fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            Console.WriteLine("Отправка файла размером" + fs.Length + "байт");
            try
            {
                sender.Send(bytes, bytes.Length, endPoint);
            }
            catch (Exception eR)
            {
                Console.WriteLine(eR.ToString());
            }
            finally
            {
                fs.Close();
                sender.Close();
            }
            Console.WriteLine("Файл успешно отправлен");
            Console.Read();
        }
}
Артур30.05 вне форума Ответить с цитированием
Старый 10.11.2014, 19:48   #7
qwaker
Пользователь
 
Регистрация: 23.12.2010
Сообщений: 25
По умолчанию

Код:
private static IPEndPoint RemoteIpEndPoint = null;
...
receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
что-то я не вижув коде момента, где RemoteIpEndPoint привязывается к клиентскому ip
и ref здесь ни к чему
хотя извините, это я путаю с клиент-сервером посредством TCP

Последний раз редактировалось qwaker; 10.11.2014 в 19:52.
qwaker вне форума Ответить с цитированием
Старый 10.11.2014, 19:55   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык говорю же, запускайте в дебаг режиме или оберните в try catch с выводом ошибки + Console.ReadLine после этого, а не только внутри try, чтобы увидеть в чем проблема.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.11.2014 в 19:57.
Alex11223 вне форума Ответить с цитированием
Старый 11.11.2014, 11:21   #9
Артур30.05
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Дык говорю же, запускайте в дебаг режиме или оберните в try catch с выводом ошибки + Console.ReadLine после этого, а не только внутри try, чтобы увидеть в чем проблема.
Всё проверил, не вижу проблемы и вот теперь в клиенте (на скриншоте), а сервер не получает файл
Изображения
Тип файла: jpg зблс.jpg (94.7 Кб, 89 просмотров)
Артур30.05 вне форума Ответить с цитированием
Старый 11.11.2014, 11:52   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну тут же написано "no address was supplied" — не указан адрес.
И как выше qwaker написал, вы нигде не присваиваете ничего endPoint.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
Клиент->Сервер->Клиент RODNOC Работа с сетью в Delphi 0 25.09.2010 11:49
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18