2013-04-18 2 views
0

내 아이디어 -> 클라이언트 서버 시스템은 TCP 소켓을 통해 텍스트 메시지 (문자열)를 교환합니다. XML을 기반으로 클라이언트와 서버 간의 프로토콜을 원합니다. 소켓 사이의 정보는 byte으로 전송되므로 전송해야합니다. 그래서 여기 내가 어떻게하는지 : 클래스 의 속성을 가진 TheMessage 클래스. 객체의 속성으로 전송할 문자열을 해당 클래스의 객체로 만들고 Object에서 byte[]부터 XmlSerialization으로 만듭니다. 다른면에서 나는 그 반대의 과정을 밟는다. 내가 직렬화와 클라이언트에서 서버로 전송하는 방법이 있습니다 :소켓을 통한 객체의 XML 직렬화

msg.Message = Console.ReadLine(); 
byte[] writeBuff = XmlRefacrotClient.ObjectToByteArray(msg); 
Stream stm = client.GetStream(); 
stm.Write(writeBuff, 0, writeBuff.Length); 

이 내가 직렬화에 사용하는 방법이다 : 나는이 데이터를 수신하는 방법

public static byte[] ObjectToByteArray(TheMessage obj) 
{ 
    try 
    { 
     MemoryStream ms = new MemoryStream(); 
     XmlSerializer xmlS = new XmlSerializer(typeof(Message.TheMessage)); 
     XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8); 

     xmlS.Serialize(xmlTW, obj); 
     ms = (MemoryStream)xmlTW.BaseStream; 

     return ms.ToArray(); 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

입니다 서버 측 :

byte[] readBuff = new byte[1024]; 
s.Receive(readBuff); 
String str = (XmlRefactorServer.ByteArrayToObject(readBuff)).ToString(); 

Console.WriteLine(str); 

이 드 - 직렬화하는 방법입니다 : ByteArrayToObjectreturnreturn xmlS.Deserialize(ms); 줄에 설명 There is an error in XML document (0, 0).InvalidOperationException을 얻을 곤하는 법까지

public static Object ByteArrayToObject(byte[] arr) 
{ 
    try 
    { 
     XmlSerializer xmlS = new XmlSerializer(typeof(Message.TheMessage)); 
     MemoryStream ms = new MemoryStream(); 
     XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8); 

     return xmlS.Deserialize(ms); 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

모든 것이 원활하게 실행됩니다.

제안 사항?

+0

바이트 배열을 가져 와서 문자열로 변환 했습니까? 아마 당신은 그것이 보이는 것을 볼 수 있다면 XML에서 오류를 발견 할 수 있습니다. – guysherman

+0

먼저 문자열 -> 바이트 배열 -> 문자열 (연결 자체를 테스트하기 위해)을 변환하여 작업을 수행했지만 정상적으로 작동했습니다. 나는 양쪽 방향으로 메시지를주고 받았다. – Milkncookiez

답변

0

시도해보십시오. 훨씬 더 깨끗합니다 :

//--------------------------------------------------------------------- 
     public static Byte[] ObjectToByteArray<T>(T obj) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       XmlSerializer xmlS = new XmlSerializer(typeof(T)); 
       xmlS.Serialize(ms, obj); 

       return ms.ToArray(); 
      } 
     } 
     //--------------------------------------------------------------------- 
     public static T ByteArrayObject<T>(Byte[] bObj) 
     { 
      using (MemoryStream ms = new MemoryStream(bObj)) 
      { 
       XmlSerializer xmlS = new XmlSerializer(typeof(TheMessage)); 
       return (T)xmlS.Deserialize(ms); 
      } 
     } 
     //--------------------------------------------------------------------- 
     public static void Sending(Byte[] bData) 
     { 
      Stream stm = client.GetStream(); 

      // always write size first when using TCP 
      Byte[] bSize = BitConverter.GetBytes(bData.Length); 
      stm.Write(bSize, 0, bSize.Length); 
      stm.Write(bData, 0, bData.Length); 
     } 

     //--------------------------------------------------------------------- 
     public static void Receiving(Byte[] bData) 
     { 
      Byte[] bSize = new Byte[sizeof(Int32)]; 
      s.Read(bSize, 0, bSize.Length); 

      Byte[] bData = new Byte[BitConverter.ToInt32(bSize, 0)]; 
      s.Read(bData, 0, bData.Length); 

      TheMessage m = ByteArrayObject<TheMessage>(bData); 
     } 
+0

오케이, 이제 작동합니다. 'Receiving()'에서's.Read()'를 쓰고'Read()'는'Socket'이 아닌'NetworkStream'의 메쏘드입니다 만,'NetworkStream (s)'을 만들었습니다. 벌금. 오류가 발생하지 않고 데이터를 전송하지만 텍스트를 시각화하지 않습니다. 서버 콘솔 창의 커서가 한 줄 아래로 내려 가면서 텍스트가 시각화되지는 않는다는 것을 알았습니다. 그 이유는 현재 콘솔에 쓸 문자열을'String'으로 가지고 있지 않기 때문입니다. 그래서 새로운 라인을 만들고있는 것입니다. 아마 나는 어떤 정보도 얻지 못할 것입니다 ...? – Milkncookiez