Просмотр полной версии : Братцы, нужна помощь в C#
bugrom256
15.04.2010, 19:31
необходимо сделать трехзвенный иерархический клиент-сервер: клиент (КПК, отпраляющий запрос) -> промежуточный сервер (только для передачи к конечному серверу)-> конечный сервер (в нем база данных, из которой происходит выборка нужной информации).
C# изучаю недавно... кто может помочь ??))
и в чем проблема?
Возможно заинтересует: https://forum.antichat.ru/showthread.php?p=2007760
bugrom256
15.04.2010, 19:57
Проблема в том, что не писал под КПК, следовательно не знаю ньюансов, и с промежуточным сервером траблы: с клиентом конектится, с конечным сервером тоже, а вот передачу сообщений от клиента серверу не получается реализовать...
Словом, не очень понятен принцип функционирования промежуточного сервера.
Есть идеи, Волшебник ????
для КПК если уж выбран .NET я понимаю будет использован .NET Compact Framework.
Честно говоря под КПК тоже ни разу не писал (не было необходимости).
Для промежуточного сервера просто написать веб-сервис, получающий данный из БД.
либо я все вижу за "розовыми очками", либо не понимаю в чем проблема.
P.S. n-tier
bugrom256
15.04.2010, 20:07
проблема в промежуточном сервере... как его писать...
вот что у меня получилось:
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();
}
}
}
}
}
}
}
проблема в пересылке, но как её устранить пока не могу понять...
POS_troi
15.04.2010, 20:25
проблема в пересылке, но как её устранить пока не могу понять...
У меня манна закончилась =( Так что раскажи уж сам что за проблема с пересылкой
пипец, сокеты...
написано в стиле 2000-2005, когда в моде были трои вида NetBus, Lamer Death.
Когда вся логика была завязана на пересылке константы.
Тут веб-сервис писать надо, хостить его на IIS и все.
bugrom256
15.04.2010, 20:27
судя по всему трабл здесь:
Sock.Receive(cldata);
Sock.Send(Encoding.ASCII.GetBytes(data));
ClientSock.Send(Encoding.ASCII.GetBytes(data));
но как его устранить ???? что не так делаю ???? использую 2 сокета и 2 порта.... может в этом трудности ????
http://ru.wikipedia.org/wiki/Веб-сервис
http://www.realcoding.net/article/view/2519
bugrom256
15.04.2010, 20:44
=))) спасибо конечно... но веб-сервисы я тоже не писал ((( а прога уже ух как нужна ((( может через сокеты на mySql получится ???
O_O
OLEDB!!!!!!
либо искать провайдеры для MySQL.
Не извращайтесь...
cheater_man
15.04.2010, 22:00
Чел вот только ненадо присваиваь себе чужой код.
У себя нашел, непомню где брал (давно это было), но рабочий
Сервер
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();
}
}
}
}
}
}
}
Этот соурс древний, и тупо написан.
bugrom256
15.04.2010, 22:02
дык я и не присваиваю )))) я его из примеров MSDN взял ))) только немного оптимизировал )))))) но не до конца, иначе работало бы всё...
cheater_man
15.04.2010, 22:17
дык я и не присваиваю )))) я его из примеров MSDN взял ))) только немного оптимизировал )))))) но не до конца, иначе работало бы всё...
Возьми пример другой тут подход устаревший ;)
bugrom256
15.04.2010, 22:18
может посоветуешь что ????)))
bugrom256
15.04.2010, 22:23
кто нить подскажет как пересылать от клиента к серверу через промежуточный сервер ????)))))) объясните смысл на пальцах, а реализую.... а то до конца не могу понять как всё происходит...
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=
bugrom256
16.04.2010, 21:49
спасибо... позже почитаю )))
bugrom256
30.04.2010, 12:19
кто-нить может мне объяснить почему клиент не до конца данные принимает ????
вот СЕРВЕР:
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();
}
}
}
Заранее очень признателен ))))
Выкладывай на _http://code-bin.homedns.org/new чтоли. Твои портянки разглядывать глаза сломаешь)
bugrom256
30.04.2010, 12:42
Готово http://code-bin.homedns.org/623
bugrom256
30.04.2010, 14:22
ну что есть идеи как это исправить ????)))))
неужели никто не шарит ??!!
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot