2014-12-31 3 views
0

Я пытаюсь установить соединение между клиентской программой и серверной программой. Отправка данных с клиента на сервер отлично работает, но я не знаю, как я могу сразу отправить ответ от сервера клиенту. Например, в этом случае у меня есть программа для гостиницы, в которой хранятся все резервации (сервер) и клиентская программа, где люди могут искать свои оговорки. Клиентская программа отправляет идентификатор клиента на сервер и должна отправить обратно сериализованную Hashtable оговорках этого клиента.Как сделать ответ сервера после получения запроса/данных

Мой клиент код выглядит следующим образом:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

const int POORT = 4001; 
IPAddress ipaddress = IPAddress.Parse("127.0.0.1"); 

socket.Connect(new IPEndPoint(ipaddress, POORT)); 

using (NetworkStream ns = new NetworkStream(socket)) { 
    using (StreamWriter sw = new StreamWriter(ns)) { 
      sw.WriteLine(klantId); 
      sw.Flush();     
    } 
} 

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

Мой код сервера:

IPAddress ipaddress = IPAddress.Parse("127.0.0.1"); 
IPEndPoint ep = new IPEndPoint(ipaddress, 4001); 

Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,        ProtocolType.Tcp); 
serverSocket.Bind(ep); 
serverSocket.Listen(50); 

try { 
    string klantid; 
    while (true) { 
      using (Socket clientSocket = serverSocket.Accept()) { 
       using (NetworkStream ns = new NetworkStream(clientSocket)) { 
        using (StreamReader sr = new StreamReader(ns)) { 
         klantid = sr.ReadLine(); 

         // Searches the reservations 
         Hashtable reservaties = hotel.ReservatiesZoeken(int.Parse(klantid)); 

         // Tried this to send the data. Doesn't seem to work. 
         using (MemoryStream stream = new MemoryStream()) { 
          BinaryFormatter formatter = new BinaryFormatter(); 
          formatter.Serialize(stream, reservaties); 
          stream.Flush(); 
          } 
         } 
        } 
       } 
      } 
    } 
    finally { 
     serverSocket.Shutdown(SocketShutdown.Both); 
     serverSocket.Close(); 
    } 

Я предполагаю, что я мог бы реализовать слушателя в клиенте и установить новое соединение с сервером клиенту , но я не мог не чувствовать, что можно отправить ответ по тому же соединению, что и запрос.

+0

Вам действительно нужно идти на низкоуровневом уровне? Не можете ли вы использовать какую-то сервис-инфраструктуру, например? WCF или WebAPI, который делает все это для вас? – ChrFin

+0

К сожалению, мне нужно, так как это проект для школы, чтобы практиковать связь между сервером и клиентом ... Это немного объясняется в наших учебниках, но не достаточно, и я не могу найти никаких ясных примеров в Интернете. – Dragorian

ответ

0

Вы закрываете розетку на клиенте сразу после отправки идентификатора. Вы должны держать его открытым и ждать, пока сервер посылает ему данные, например:

Socket socket = new Socket(AddressFamily.InterNetwork, ...); 

// open and send ID 

int dataAvailable = 0; 
while (dataAvailable == 0 || dataAvailable != socket.Available) 
{ 
    dataAvailable = socket.Available; 
    Thread.Sleep(100); // if no new data after 100ms assume transmission finished 
} 

var data = new byte[dataAvailable]; 
socket.Receive(data); 

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

ОТКАЗ: Это не «готовый к производству код» и должен просто дать вам подсказку, как вы могли бы решить вашу проблему , Например, часть «wait 100ms» НЕ должна использоваться в производственном коде ...

+0

'Thread.Sleep (100); // если новые данные после 100 мс не предполагают, что передача завершена '- ugh, terribru. –

+0

@MartinJames: Да, но ОЧЕНЬ прост ;-). Не стесняйтесь предлагать лучший способ - меня всегда интересуют, как другие делают такие вещи. В «реальном коде» я бы, вероятно, отправил длину данных в виде первых нескольких байтов, чтобы узнать, сколько данных будет отправлено, но для этого примера это простое решение должно работать просто отлично ... – ChrFin

 Смежные вопросы

  • Нет связанных вопросов^_^