необходимо сделать трехзвенный иерархический клиент-сервер: клиент (КПК, отпраляющий запрос) -> промежуточный сервер (только для передачи к конечному серверу)-> конечный сервер (в нем база данных, из которой происходит выборка нужной информации). C# изучаю недавно... кто может помочь ??))
Проблема в том, что не писал под КПК, следовательно не знаю ньюансов, и с промежуточным сервером траблы: с клиентом конектится, с конечным сервером тоже, а вот передачу сообщений от клиента серверу не получается реализовать... Словом, не очень понятен принцип функционирования промежуточного сервера. Есть идеи, Волшебник ????
для КПК если уж выбран .NET я понимаю будет использован .NET Compact Framework. Честно говоря под КПК тоже ни разу не писал (не было необходимости). Для промежуточного сервера просто написать веб-сервис, получающий данный из БД. либо я все вижу за "розовыми очками", либо не понимаю в чем проблема. P.S. n-tier
проблема в промежуточном сервере... как его писать... вот что у меня получилось: 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(); } } } } } } } проблема в пересылке, но как её устранить пока не могу понять...
пипец, сокеты... написано в стиле 2000-2005, когда в моде были трои вида NetBus, Lamer Death. Когда вся логика была завязана на пересылке константы. Тут веб-сервис писать надо, хостить его на IIS и все.
судя по всему трабл здесь: Sock.Receive(cldata); Sock.Send(Encoding.ASCII.GetBytes(data)); ClientSock.Send(Encoding.ASCII.GetBytes(data)); но как его устранить ???? что не так делаю ???? использую 2 сокета и 2 порта.... может в этом трудности ????
=))) спасибо конечно... но веб-сервисы я тоже не писал ((( а прога уже ух как нужна ((( может через сокеты на mySql получится ???
Чел вот только ненадо присваиваь себе чужой код. У себя нашел, непомню где брал (давно это было), но рабочий Сервер 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(); } } } } } } } Этот соурс древний, и тупо написан.
дык я и не присваиваю )))) я его из примеров MSDN взял ))) только немного оптимизировал )))))) но не до конца, иначе работало бы всё...
кто нить подскажет как пересылать от клиента к серверу через промежуточный сервер ????)))))) объясните смысл на пальцах, а реализую.... а то до конца не могу понять как всё происходит...
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=
кто-нить может мне объяснить почему клиент не до конца данные принимает ???? вот СЕРВЕР: 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(); } } } Заранее очень признателен ))))