2013-12-20 3 views
1

Я в кодировании 3D некоторое время, и теперь я не хочу создавать игру, которая работает с Networking. Я использую System.Net и System.Net.Sockets.C# Client Server TCP Client Listening

Мой сервер - это глупо, черт возьми, он просто может поддерживать одно соединение (позже я изменю его на возможности множественного соединения). Он имеет TcpListener, который прослушивает 127.0.0.1 на Port 10000. (Просто для тестирования). Там у меня есть Lo While Loop, который проверяет полученные данные и дисплеи.

Мой клиент - TcpClient. Он подключается к серверу и отправляет сообщение. Здесь ничего особенного, это делается с помощью TcpClient.GetStream(). Write(). Это отлично работает. Я также могу прочитать один ответ сразу после отправки.

Но что, если сервер отправит какую-либо информацию без запроса Клиента? Например: все игроки на сервере получают элемент. Как мне настроить свой клиент, чтобы иметь возможность получать такие сообщения?

Должен ли мой клиент запросить в цикле? Или мне нужно как-то сделать делегата? Я могу создать цикл, который запрашивает такую ​​информацию каждые 200 миллисекунд или что-то в этом роде, но как это изменит производительность 3D-игры?

Как это делается при разработке профессиональной игры?

ответ

0

Использование асинхронного клиент Цоколь:

«Клиент построен с асинхронной розеткой, поэтому выполнение клиентского приложения не приостанавливается, пока сервер возвращает ответ»

http://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

private static void ReceiveCallback(IAsyncResult ar) { 
     try { 
      // Retrieve the state object and the client socket 
      // from the asynchronous state object. 
      StateObject state = (StateObject) ar.AsyncState; 
      Socket client = state.workSocket; 

      // Read data from the remote device. 
      int bytesRead = client.EndReceive(ar); 

      if (bytesRead > 0) { 
       // There might be more data, so store the data received so far. 
      state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); 

       // Get the rest of the data. 
       client.BeginReceive(state.buffer,0,StateObject.BufferSize,0, 
        new AsyncCallback(ReceiveCallback), state); 
      } else { 
       // All the data has arrived; put it in response. 
       if (state.sb.Length > 1) { 
        response = state.sb.ToString(); 
       } 
       // Signal that all bytes have been received. 
       receiveDone.Set(); 
      } 
     } catch (Exception e) { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

В этом ReceiveCallback вы можете создать переключатель, который обрабатывает сообщения сервера.

Например: Первый байт сообщения - это команда и после команды - правильные данные. Внутри коммутатора вы можете обрабатывать эту команду и выполнять некоторый код.

0

Используйте асинхронные возможности классов TcpClient и TcpListener.
У вашего клиента:

private TcpClient server = new TcpClient(); 

void listen(){ 
    try { 
     IPAddress IP = IPAddress.Loopback // this is your localhost IP 
     await server.ConnectAsync(IP,10000); // IP, port number 

     if(server.Connected) { 
      NetworkStream stream = server.GetStream(); 

      while (server.Connected) { 
       byte[ ] buffer = new byte[server.ReceiveBufferSize]; 
       int read = await stream.ReadAsync(buffer, 0, buffer.Length); 
       if (read > 0){ 
        // you have received a message, do something with it 
       } 
      } 
     } 
    } 
    catch (Exception ex) { 
     // display the error message or whatever 
     server.Close(); 
    } 
}