2011-12-31 3 views
0

Я работаю над очень простой серверной/клиентской программой. Я хочу отправить класс костюма с сервера клиенту и наоборот. После некоторых исследований я выяснил, как отправить объект и получить его. Хотя после отправки объекта я больше не могу отправлять. Сообщение отправки не выдает никаких исключений, но получатель никогда не получает сообщение. Любая помощь будет оценена по достоинству.Отправка последовательных объектов по TCP

public abstract class baseClient 
{ 
    private Player player; 

    private Thread chat; 
    private NetworkStream messageStream; 
    private BinaryFormatter formatter; 
    private List<MSG> MSGM; 
    private List<String> MSGS; 
    private BinaryReader reader; 
    private BinaryWriter writer; 

    private String ExceptionMessage; 

    public baseClient() 
    { 
     formatter = new BinaryFormatter(); 
     MSGM = new List<MSG>(); 
     MSGS = new List<String>(); 
     chat = new Thread(new ThreadStart(doChat)); 
     chat.Start(); 
    } 
    public abstract void doChat(); 


    public void setMessageStream(NetworkStream stream) { messageStream = stream; } 
    public void setReader(BinaryReader reader) { this.reader = reader; } 
    public void setFormatter(BinaryFormatter formatter) { this.formatter = formatter; } 
    public void setPlayer(Player player) { this.player = player; } 
    public void setExceptionMessage(String message) { ExceptionMessage = message; } 
    public void clearMessageMSG() { MSGM.Clear(); } 
    public void clearStringMSG() { MSGS.Clear(); } 
    public void setWriter(BinaryWriter writer) { this.writer = writer; } 


    public NetworkStream getMessageStream() { return messageStream; } 
    public void addMSGM(MSG obj) { MSGM.Add(obj); } 
    public void addMSGS(String obj) { MSGS.Add(obj); } 
    public BinaryReader getReader() { return reader; } 
    public BinaryFormatter getFormatter() { return formatter; } 
    public List<MSG> getMessageMSG() { return MSGM; } 
    public List<String> getStringMSG() { return MSGS; } 
    public BinaryWriter getWriter() { return this.writer; } 
    public Player getPlayer() { return player; } 

    public void handleInput() 
    { 
     try 
     { 
      Object obj = getObject(); 

      if (obj != null) 
      { 
       if (obj is Player) 
        setPlayer((Player)obj); 
       if (obj is MSG) 
        addMSGM((MSG)obj); 
       else if (obj is String) 
        addMSGS((String)obj); 
      } 

     } 
     catch (Exception e) 
     { 
      setExceptionMessage(e.ToString()); 
     } 
    } 
    public Object getObject() 
    { 
     try 
     { 


      Stream stream = getReader().BaseStream; 

      object obj = formatter.Deserialize(stream); 

      stream.Flush(); 
      // stream.Close(); 
      return obj; 
     } 
     catch (Exception e) 
     { 
      ExceptionMessage= e.ToString(); 
      return e; 
     } 
    } 
    public String getString() 
    { 
     try 
     { 
      string reply = reader.ReadString(); 
      return reply; 
     } 
     catch (Exception e) 
     { 
      ExceptionMessage = e.ToString(); 
      return null; 
     } 
    } 
    public bool sendMessage(Object msg) 
    { 
     try 
     { 
      Byte[] buffer = SerializeMultipleObjects(msg).GetBuffer(); 
      getMessageStream().Write(buffer, 0, buffer.Length); 
      getMessageStream().Flush(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      setExceptionMessage(e.ToString()); 
      return false; 
     } 
    } 
    public bool sendString(String msg) 
    { 
     try 
     { 
      writer.Write(msg); 
      writer.Flush(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      setExceptionMessage(e.ToString()); 
      return false; 
     } 
    } 
    private MemoryStream SerializeMultipleObjects(Object obj) 
    { 
     MemoryStream stream = new MemoryStream(); 
     getFormatter().Serialize(stream, obj); 
     stream.Flush(); 
     return stream; 
    } 

} 
+0

Почему бы не использовать WCF? Он может сериализовать объекты как двоичные по TCP. Очень эффективен, и все это работает для вас. –

ответ

2

Я рекомендую вам использовать установленную среду обмена сообщениями, такую ​​как WCF. Это вы настаиваете на написании собственного протокола TCP/IP, вам понадобится message framing.

+0

+1 для менее понятного сообщения обрамление –

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