Братцы, нужна помощь в C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by bugrom256, 15 Apr 2010.

  1. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    необходимо сделать трехзвенный иерархический клиент-сервер: клиент (КПК, отпраляющий запрос) -> промежуточный сервер (только для передачи к конечному серверу)-> конечный сервер (в нем база данных, из которой происходит выборка нужной информации).

    C# изучаю недавно... кто может помочь ??))
     
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    и в чем проблема?

    Возможно заинтересует: https://forum.antichat.ru/showthread.php?p=2007760
     
  3. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Проблема в том, что не писал под КПК, следовательно не знаю ньюансов, и с промежуточным сервером траблы: с клиентом конектится, с конечным сервером тоже, а вот передачу сообщений от клиента серверу не получается реализовать...

    Словом, не очень понятен принцип функционирования промежуточного сервера.
    Есть идеи, Волшебник ????
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    для КПК если уж выбран .NET я понимаю будет использован .NET Compact Framework.
    Честно говоря под КПК тоже ни разу не писал (не было необходимости).
    Для промежуточного сервера просто написать веб-сервис, получающий данный из БД.

    либо я все вижу за "розовыми очками", либо не понимаю в чем проблема.

    P.S. n-tier
     
    1 person likes this.
  5. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    проблема в промежуточном сервере... как его писать...

    вот что у меня получилось:

    using System; /////////////////////////////////////////////////
    using System.Collections.Generic;///// Консольный стандарт ////
    using System.Text;/////////////////////////////////////////////
    using System.Net.Sockets; // Вот он, родимый коллекшн классов /
    using System.Threading; // Коллекшн для работы с потоками /////
    using System.IO;
    using System.Net;

    namespace tcp_between_server
    {
    class Program
    {
    static void Main(string[] args)
    {
    string cmd;
    // Console.Write("Port to listen: ");
    // int port = Convert.ToInt32(Console.ReadLine());
    Int32 port1 = 4000;
    Console.WriteLine("Creating server...");
    Server Serv = new Server(); // Создаем новый экземпляр класса
    // сервера
    Serv.Create(port1);

    while (true)
    {
    cmd = Console.ReadLine(); // Ждем фразы EXIT когда
    // понадобится выйти из приложения.
    // интерактивность.
    if (cmd == "EXIT")
    {
    Serv.Close(); // завершение сервера.
    return;
    }
    }
    }

    public class Server // класс сервера.
    {
    private int LocalPort;
    private Thread ServThread; // экземпляр потока
    TcpListener Listener; // листенер))))


    public void Create(int port1)
    {
    LocalPort = port1;
    ServThread = new Thread(new ThreadStart(ServStart));
    ServThread.Start(); // запустили поток. Стартовая функция –
    // ServStart, как видно выше
    }

    public void Close() // Закрыть серв
    {
    Listener.Stop();
    ServThread.Abort();
    return;
    }

    private void ServStart()
    {
    Socket ClientSock; // сокет для обмена данными.
    TcpClient Client = new TcpClient();
    string data;
    byte[] cldata = new byte[1024]; // буфер данных
    IPAddress sock_addr = IPAddress.Parse("127.0.0.1");
    TcpListener Listener = new TcpListener(sock_addr, LocalPort);
    try
    {
    Listener.Start(); // начали слушать
    }
    catch (SocketException exc)
    {
    Console.WriteLine("Error: " + exc.Message);
    }
    Console.WriteLine("Waiting connections [" + Convert.ToString(LocalPort) + "]...");
    try
    {
    ClientSock = Listener.AcceptSocket(); // пробуем принять
    // клиента
    }
    catch
    {
    ServThread.Abort(); // нет – жаль(
    return;
    }
    int i = 0;

    if (ClientSock.Connected)
    {
    while (true)
    {
    try
    {

    string ip = "127.0.0.1";
    Int32 port = 5000;
    Client.Connect(ip, port);

    i = ClientSock.Receive(cldata); // попытка чтения
    // данных
    }
    catch
    {
    Console.WriteLine("\n\t\t\tCannot connect to remote host!");
    Console.WriteLine("\n\n\n\t\t\t Press any key to continue...");
    Console.ReadKey();
    return;
    }

    try
    {
    if (i > 0)
    {


    data = Encoding.ASCII.GetString(cldata).Trim();
    Console.WriteLine("<" + data);
    if (data == "CLOSE") // если CLOSE –
    // завершение работы клиента и сервера
    {
    ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
    ClientSock.Close();
    Listener.Stop();
    Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
    ServThread.Abort();
    return;
    }
    else
    { // нет – отправляем данные клиенту.
    Socket Sock = Client.Client;

    // ClientSock.Send(Encoding.ASCII.GetBytes(data));
    Sock.Receive(cldata);
    Sock.Send(Encoding.ASCII.GetBytes(data));

    ClientSock.Send(Encoding.ASCII.GetBytes(data));
    cldata = new byte[1024];

    }
    }
    }
    catch
    {
    ClientSock.Close(); // ну эт если какая хрень..
    Listener.Stop();
    Console.WriteLine("Server closing. Reason: client offline. Type EXIT to quit the application.");
    ServThread.Abort();
    }
    }
    }
    }
    }
    }
    }

    проблема в пересылке, но как её устранить пока не могу понять...
     
  6. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    У меня манна закончилась =( Так что раскажи уж сам что за проблема с пересылкой
     
  7. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    пипец, сокеты...

    написано в стиле 2000-2005, когда в моде были трои вида NetBus, Lamer Death.

    Когда вся логика была завязана на пересылке константы.

    Тут веб-сервис писать надо, хостить его на IIS и все.
     
    #7 W!z@rD, 15 Apr 2010
    Last edited: 16 Apr 2010
  8. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    судя по всему трабл здесь:
    Sock.Receive(cldata);
    Sock.Send(Encoding.ASCII.GetBytes(data));

    ClientSock.Send(Encoding.ASCII.GetBytes(data));

    но как его устранить ???? что не так делаю ???? использую 2 сокета и 2 порта.... может в этом трудности ????
     
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    http://ru.wikipedia.org/wiki/Веб-сервис

    http://www.realcoding.net/article/view/2519
     
  10. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    =))) спасибо конечно... но веб-сервисы я тоже не писал ((( а прога уже ух как нужна ((( может через сокеты на mySql получится ???
     
  11. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    O_O

    OLEDB!!!!!!
    либо искать провайдеры для MySQL.

    Не извращайтесь...
     
  12. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Чел вот только ненадо присваиваь себе чужой код.
    У себя нашел, непомню где брал (давно это было), но рабочий
    Сервер
    Code:
    using System; /////////////////////////////////////////////////
    using System.Collections.Generic;///// Консольный стандарт ////
    using System.Text;/////////////////////////////////////////////
    using System.Net.Sockets; // Вот он, родимый коллекшн классов /
    using System.Threading; // Коллекшн для работы с потоками /////
     
    namespace tcpserver
    {
        class Program
        {
            static void Main(string[] args)
            {
                string cmd;
                Console.Write("Port to listen: ");
                int port = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Creating server...");
                Server Serv = new Server(); // Создаем новый экземпляр класса 
                                            // сервера
                Serv.Create(port);
                
                while (true)
                {
                    cmd = Console.ReadLine(); // Ждем фразы EXIT когда 
                                              // понадобится выйти из приложения.
                                              // типа интерактивность.
                    if (cmd == "EXIT")
                    {
                        Serv.Close(); // раз выход – значит выход. Серв-нах.
                        return;
                    }
                }
            } 
     
            public class Server // класс сервера.
            {
                private int LocalPort;
                private Thread ServThread; // экземпляр потока
                TcpListener Listener; // листенер))))
                
                public void Create(int port)
                {
                    LocalPort = port;
                    ServThread = new Thread(new ThreadStart(ServStart));
                    ServThread.Start(); // запустили поток. Стартовая функция – 
                                        // ServStart, как видно выше
                }
                
                public void Close() // Закрыть серв?
                {
                    Listener.Stop();
                    ServThread.Abort();
                    return;
                }
            
                private void ServStart()
                {
                    Socket ClientSock; // сокет для обмена данными.
                    string data;
                    byte[] cldata = new byte[1024]; // буфер данных
                    Listener = new TcpListener(LocalPort); 
                    Listener.Start(); // начали слушать
                    Console.WriteLine("Waiting connections [" + Convert.ToString(LocalPort) + "]...");
                    try
                    {
                        ClientSock = Listener.AcceptSocket(); // пробуем принять 
                                                              // клиента
                    }
                    catch
                    {
                        ServThread.Abort(); // нет – жаль(
                        return;
                    }
                    int i=0;
            
                    if (ClientSock.Connected)
                    {
                        while (true)
                        {
                            try
                            {
                                i = ClientSock.Receive(cldata); // попытка чтения 
                                                                // данных
                            }
                            catch
                            {
                            }
     
                            try
                            {
                                if (i > 0)
                                {
                                
                                    data = Encoding.ASCII.GetString(cldata).Trim();
                                    Console.WriteLine("<" + data);
                                    if (data == "CLOSE") // если CLOSE – 
                                                         // вырубимся
                                    {
                                        ClientSock.Send(Encoding.ASCII.GetBytes("Closing the server..."));
                                        ClientSock.Close();
                                        Listener.Stop();
                                        Console.WriteLine("Server closed. Reason: client wish! Type EXIT to quit the application.");
                                        ServThread.Abort();
                                        return;
                                    } 
                                    else
                                    { // нет – шлем данные взад.
                                        ClientSock.Send(Encoding.ASCII.GetBytes("Your data: " + data));
                                    }
                                }
                            }
                            catch
                            {
                                ClientSock.Close(); // ну эт если какая хрень..
                                Listener.Stop();
                                Console.WriteLine("Server closing. Reason: client offline. Type EXIT to quit the application.");
                                ServThread.Abort();
                            }
                        }
                    }
                }
            }
        }
    }
    
    Этот соурс древний, и тупо написан.
     
    #12 cheater_man, 15 Apr 2010
    Last edited: 15 Apr 2010
  13. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    дык я и не присваиваю )))) я его из примеров MSDN взял ))) только немного оптимизировал )))))) но не до конца, иначе работало бы всё...
     
  14. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Возьми пример другой тут подход устаревший ;)
     
  15. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    может посоветуешь что ????)))
     
  16. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    кто нить подскажет как пересылать от клиента к серверу через промежуточный сервер ????)))))) объясните смысл на пальцах, а реализую.... а то до конца не могу понять как всё происходит...
     
  17. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    http://www.google.ru/search?hl=ru&source=hp&q=3-tier+architecture+in+asp.net&lr=&aq=2&aqi=g7&aql=&oq=3-tier+&gs_rfai=
     
  18. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    спасибо... позже почитаю )))
     
  19. bugrom256

    bugrom256 Banned

    Joined:
    14 Apr 2010
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    кто-нить может мне объяснить почему клиент не до конца данные принимает ????

    вот СЕРВЕР:
    using System;
    using System.IO;
    using System.Threading;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;

    public class ClientHandler
    {
    private static int nbFiles;
    private static int nbMatchFiles;

    private const String dirPath = @"C:\Users\Romario\Desktop";
    private String pattern;

    // StreamReader readerStream1;
    // NetworkStream writerStream;




    //-----------------------------------------------------------------------------------------------------

    public TcpClient clientSocket;
    // Socket sock;
    public void SearchForStandard(string path, string text, bool recurse)
    {

    foreach (String file in Directory.GetFiles(path, "*.txt"))
    {
    Interlocked.Increment(ref nbFiles);
    FindInFile(file, text);

    }
    if (recurse)
    {
    foreach (String dir in Directory.GetDirectories(path))
    {
    SearchForStandard(dir, text, recurse);
    }
    }
    }

    public void FindInFile(string csFilePath, string text)
    {
    try
    {
    NetworkStream writerStream = clientSocket.GetStream();
    if (File.ReadAllText(csFilePath).IndexOf(text) >= 0)
    {
    Interlocked.Increment(ref nbMatchFiles);
    string filename = Path.GetFileName(csFilePath);
    Console.WriteLine("________________________________________________________________________");
    Console.WriteLine(nbMatchFiles + "." + text + "\t\tName of File: " + filename);
    /* StreamReader sr = File.OpenText(csFilePath);
    string s = "";
    while ((s = sr.ReadLine()) != null)
    {
    Console.WriteLine(s);

    byte[] dataWrite = Encoding.ASCII.GetBytes(s);

    writerStream.Write(dataWrite, 0, dataWrite.Length);
    }
    */
    FileStream stream = new FileStream(csFilePath, FileMode.Open);
    StreamReader readerStream = new StreamReader(stream);

    string s = readerStream.ReadToEnd();

    byte[] dataWrite = Encoding.ASCII.GetBytes("________________________________________________________________________\n" + filename + "\n________________________________________________________________________\n" + s);
    writerStream.Write(dataWrite, 0, dataWrite.Length);

    stream.Close();
    //readerStream.Close();

    Console.WriteLine("________________________________________________________________________\n" + s);
    // Console.WriteLine("\n________________________________________________________________________\n");

    }
    // else
    // {
    // byte[] dataWrite = Encoding.ASCII.GetBytes("\r\n");
    // writerStream.Write(dataWrite, 0, dataWrite.Length);

    // }
    }
    catch (Exception exp)
    {
    Console.WriteLine("Exception: " + exp.Message);
    }


    }

    public void RunClient()
    {
    StreamReader readerStream = new StreamReader(clientSocket.GetStream());
    NetworkStream writerStream = clientSocket.GetStream();

    string returnData = readerStream.ReadLine();
    string userName = returnData;

    Console.WriteLine("Welcome " + userName + " to the Server");

    while (true)
    {

    returnData = readerStream.ReadLine();

    if (returnData.IndexOf("QUIT") > -1)
    {
    Console.WriteLine("Bye bye " + userName);
    break;
    }
    // Console.WriteLine(userName + " : " + returnData);
    // returnData += "\r\n";
    //-----------------------------------------------------------------------------------------------------
    pattern = returnData;

    Console.WriteLine("Searching for : " + pattern);

    nbFiles = 0;
    nbMatchFiles = 0;
    DateTime start = DateTime.Now;

    Console.WriteLine("Search using Standard Processing");
    SearchForStandard(dirPath, pattern, true);

    Console.WriteLine(string.Format("Total files : {0}", nbFiles));
    Console.WriteLine(string.Format("found in files : {0}", nbMatchFiles));
    Console.WriteLine(string.Format("Search Duration : {0}", DateTime.Now.Subtract(start).ToString()));



    //-----------------------------------------------------------------------------------------------------
    // pattern = returnData;
    // returnData = "\r\n";
    // byte[] dataWrite = Encoding.ASCII.GetBytes(returnData);
    // writerStream.Write(dataWrite, 0, dataWrite.Length);
    }
    clientSocket.Close();
    }
    }


    public class MultiThreading_Server
    {
    const int ECHO_PORT = 4000;
    //IPAddress ip = IPAddress.Parse("192.168.0.1");
    public static int nClients = 0;

    //---------------------------УСТАНОВКА ЗАГОЛОВКА ОКНА--------------------------
    [DllImport("kernel32.dll")]
    public static extern bool SetConsoleTitle(String lpConsoleTitle);

    [STAThread]
    //-----------------------------------------------------------------------------
    public static void Main(string[] arg)
    {
    SetConsoleTitle("END SERVER"); // УСТАНОВКА ЗАГОЛОВКА ОКНА

    try
    {

    //Связываем сервер с локальным портом
    // IPAddress localadr = IPAddress.Parse("192.168.0.1");
    // TcpListener clientListener = new TcpListener(localadr, ECHO_PORT);
    TcpListener clientListener = new TcpListener(ECHO_PORT);
    //Начинаем слушать
    clientListener.Start();

    Console.WriteLine("Waiting for connections...");

    while (true)
    {

    //Даем согласие на соединение
    TcpClient client = clientListener.AcceptTcpClient();

    ClientHandler cHandler = new ClientHandler();

    //Передаем значение объекту ClientHandler
    cHandler.clientSocket = client;

    //Создаем новый поток для клиент
    Thread clientThread = new Thread(new ThreadStart(cHandler.RunClient));

    clientThread.Start();
    }
    clientListener.Stop();
    }
    catch (Exception exp)
    {
    Console.WriteLine("Exception: " + exp.Message);
    Console.ReadKey();
    }
    }
    }


    ВОТ КЛИЕНТ:
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections.Generic;
    using System.Collections;
    using System.Linq;
    using System.Text;

    public class EchoClient
    {
    const int ECHO_PORT = 4000;

    public static void Main(string[] arg)
    {
    // Console.Write("Your UserName: ");
    // string userName = Console.ReadLine();
    string userName = "Client";
    Console.WriteLine("---Logged In---");

    try
    {
    //Создаем соединение с ChatServer
    TcpClient eClient = new TcpClient("127.0.0.1", ECHO_PORT);

    //Создаем классы потоков
    StreamReader readerStream = new StreamReader(eClient.GetStream());
    NetworkStream writerStream = eClient.GetStream();

    string dataToSend;

    dataToSend = userName;
    dataToSend += "\r\n";

    //Отправляем имя пользователя на сервер
    byte[] data = Encoding.ASCII.GetBytes(dataToSend);

    writerStream.Write(data,0,data.Length);

    while (true)
    {
    Console.Write(userName + ":");

    //Считываем строку с сервера
    dataToSend = Console.ReadLine();
    dataToSend += "\r\n";

    data = Encoding.ASCII.GetBytes(dataToSend);
    writerStream.Write(data,0,data.Length);

    //Если отправлена команда QUIT, то выходим из приложения
    if (dataToSend.IndexOf("QUIT") > -1)
    break;

    string returnData;

    //Получить ответ от сервера
    Console.WriteLine("Server: ");

    while ((returnData = readerStream.ReadLine()) != null)
    {
    // if (string.IsNullOrEmpty(returnData)) break;
    Console.WriteLine(returnData);
    }

    /* returnData = readerStream.ReadLine();
    while (!readerStream.EndOfStream)
    {
    // if (returnData == "") break;
    // if (string.IsNullOrEmpty(returnData)) break;
    Console.WriteLine(returnData);
    // returnData = readerStream.ReadLine();
    }
    */
    }
    //Закрыть TcpClient
    eClient.Close();
    }
    catch(Exception exp)
    {
    Console.WriteLine("Exception: " + exp.Message);
    Console.ReadKey();
    }
    }

    }

    Заранее очень признателен ))))
     
  20. Feonor

    Feonor Elder - Старейшина

    Joined:
    23 Jul 2008
    Messages:
    128
    Likes Received:
    52
    Reputations:
    19
    Выкладывай на _http://code-bin.homedns.org/new чтоли. Твои портянки разглядывать глаза сломаешь)