2011-12-17 2 views
3

У меня есть клиент/серверное приложение, сделанное с C#. Он отлично работает, когда я отправляю строки сообщений на сервер. Но мне нужно отправлять (простые) объекты на сервер вместо строк. Но я не уверен, как это сделать. Я в настоящее время это для моего клиента:Отправить объект серверу на C#

Класс я хочу отправить:

[Serializable] 
public class Actions 
{ 
// Movement 
public bool forward = false; 
public bool left = false; 
public bool backward = false; 
public bool right = false; 
} 

Затем я отправить объект с помощью Send по умолчанию команды(). Но до этого я happends преобразовать класс действия в массив байт первым, так как:

public void SendObject (object obj) 
{ 
    this.socket.Send (this.ObjectToByteArray (obj)); 
} 

// Convert an object to a byte array 
private byte[] ObjectToByteArray(object obj) 
{ 
    if(obj == null) 
     return null; 

    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, obj); 
    return ms.ToArray(); 
} 

На стороне сервера я получить данные, как это (и то был я застрял на ...) :

public void OnDataReceived(IAsyncResult asyn) 
{ 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
    try 
    { 
     // Complete the BeginReceive() asynchronous call by EndReceive() method 
     // which will return the number of characters written to the stream 
     // by the client 
     int iRx = socketData.m_currentSocket.EndReceive (asyn); 
     char[] chars = new char[iRx + 1]; 

     // CONVERT THE BYTE ARRAY BACK TO AN OBJECT 
     //object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
    } 
    catch (...) { } 
} 

Что мне нужно сделать, чтобы я мог получить доступ к объекту на сервере? Очевидно, когда я делаю: Cls.forward;

Тогда это дает мне ошибку, потому что она не знает, какие свойства имеет объект. Кто-нибудь знает, как это сделать?

+0

1.Вы хотите только к розетке? Есть и другие решения для этого, например, для удаленного доступа или WCF. Также, когда несколько клиентов сообщают о своей проблеме. 2. Другой способ - пройти этот путь Сначала отправить SizeofByarray Than send object array. – dotnetstep

ответ

2

Cast из объекта в Actions:

object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
Actions action = (Actions)Cls; 

Это самый простой способ сделать это. Вы также должны добавить обработку исключений, проверку типов и т. Д.

+0

Спасибо, отлично работает. – w00

1

Как правило, как клиент, так и сервер должны знать о типах объектов, которые могут быть сериализованы по всему соединению.

Во-вторых, вам нужен способ указания того, какой объект вы проходите, поэтому другой конец знает, как его десериализовать. Это может быть по соглашению (один и тот же вызов всегда отправляет одно и то же сообщение) или с дополнительными данными в потоке сообщений. Или с другим сериализатором.

Вы вообще не смотрите на WCF? Он предоставляет способы абстрагирования всего этого довольно красиво через контракты с данными.

+0

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

+0

Я не вижу, как эти две вещи конфликтуют друг с другом, если только двигатель не включает в себя фактическую связь клиент/сервер. – Joe