2011-11-04 71 views
1

我有一个对象列表,我想发送它认为TCP套接字连接。一种方法是获取对象列表,并通过逗号和接收数据获取将它们分开的所有值,另一方面获取对象中的值和值。我可以发送一个对象列表,因为它可以在WCF Web服务中完成。你能告诉我怎么做?谢谢!如何通过套接字发送对象C#

我确实已经为此创建了一个WCF服务,但改变了它,因为它有一些无法解决的问题。所以我创建这个客户端服务器应用程序。

此外,正在发送的数据每隔几秒刷新一次,而且很多用户都需要它。经过一番研究后,我发现这将是一个更好的选择。

我有这个类与我是通过

public void SendMessage(string text) 
{ 
    Byte[] bytesSent = Encoding.UTF8.GetBytes(text); 
    SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs(); 
    writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length); 
    socket.SendAsync(writeEventArgs); 
} 

送我的消息,但我会出来,而第一个序列化对象,然后将其发送。所以我有一个流,需要作为一个字节数组。

这是我必须接受的数据:

void ReceiveData() 
{ 
    try 
    { 
     int recv; 
     string stringData; 
     while (true) 
     { 
      recv = socket.Receive(data); 
      stringData = Encoding.ASCII.GetString(data, 0, recv); 
      if (stringData == "bye") 
       break; 
      ClientDataRecievedEventArgs sd = new ClientDataRecievedEventArgs(stringData); 
      DataRecieved(this, sd); 
     } 
     stringData = "bye"; 
     byte[] message = Encoding.ASCII.GetBytes(stringData); 
     socket.Send(message); 
     socket.Close(); 
     this.Dispose(); 
     return; 
    } 
    catch (Exception) 
    { 
     socket.Close(); 
     this.Dispose(); 
    } 

} 

这是要我使用:

SoapFormatter formatter = new SoapFormatter(); 

foreach (Communication.Client Client in server.ClientList) 
{ 
    foreach (ObjectLibrary.Model.PIP p in Repository.GlobalRepository.PIPInformation) 
    { 

     formatter.Serialize(stream, p); 
     Client.SendMessage(stream); 
    } 
} 

如何初始化流? 我需要将数据作为Stream将其反序列化为Object。

所以我有对象列表我可以序列化整个列表?

+1

你有没有尝试从你的任何代码?如果是,那么你可以具体说明你在通过tcp套接字发送对象列表时面临的问题。 –

+0

还检查了这个线程[发送通过套接字序列化对象] [1] [1]:http://stackoverflow.com/q/1536169/164906 – ViktorZ

+0

@Taufiq:如果你有很强的等待时间要求(例如,你正在创建一个网络化的第一人称射击游戏或其他基于实时物理的游戏),或者试图实现一个新的或现有的低级互联网协议,只有这样我才能继续使用基于套接字的方法。否则,我会考虑更简单和更高层次的技术,如WCF。它更加灵活(就代码分解而言),并且可以让您避免在大多数情况下考虑大部分细节。 –

回答

7

你必须“序列化”这些对象,并在另一侧对它们进行反序列化。有关这方面的信息,请参阅http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx

尽管如此,如果在发送数据时连接发生问题,可能没有足够的数据来完全重新创建对象,并且程序可能会在某些意外的地方失败。只有在收到所有东西时才创建对象。

+0

对象列表? – thewayman

+0

或者序列化列表中的所有对象,并将序列化的数据放入一个大缓冲区并立即发送整个缓冲区;或者遍历lsit列表,序列化一个对象并立即发送。如果您需要发送整个列表,第一种方法是最好的,第二种方法是发送部分列表(如果发生错误),则可以使用第二种方法。 –

2

你有很多用于序列化的对象,比如二进制,XML,JSON,但也有一种远程方法,并不是说你可以创建Web服务。在最后两种情况下,“发送”和对象是微不足道的,它等于将它作为参数放入方法签名中。

1

为什么你想通过套接字自己发送数据,而这样做的协议(高于TCP)已经证明了它们的价值?

你必须创建一个协议来发送和接收数据,并实现这个协议,在那里你将花费大量的时间在已经完成并已经存在多年的事情上。更不用说调试乏味的东西了,这些东西可以用于编程的一部分,为“无聊”部分设置语言和框架,并将它们连接在一起解决您遇到的问题。

你必须关心的是用于不同数据对象和丢弃连接的实例分隔符(协议中的一种Content-Length头,告诉接收方它有多少期望的数据)。

为什么不简单地使用WCF作为SOAP,REST或JSON的包装(如果另一方说的话)或者Net.TCP如果要实现客户端和服务器?

然后,您只需调用服务方法MyObject[] GetObjects():所有无聊的东西都将由框架处理,并且您在客户端按原样接收MyObject数组。在后台从HTTP头到序列化到检测丢弃的连接和抛出相关的异常都将为您完成。这节省了严重的时间和麻烦。

或者您可以使用普通的HTTP,创建一个小型的Web应用程序,您可以通过您喜欢的序列化格式请求数据,并在通过HttpClient收到数据后将客户端数据反序列化。

+0

我已更新我的问题! – thewayman

+0

您遇到无法解决的WCF问题,因此您开始创建自己的图层?你最好花更多的时间让WCF工作。或者在IIS中托管数据并让客户端通过HTTP轮询新数据。如果你没有看到'if(stringData ==“bye”)break'有什么问题;'我真的帮不了你。 – CodeCaster

+0

此代码也来自一个更简单的项目。这似乎工作正常,而且我在这个领域的骨干,所以代码if(stringData ==“bye”)break;有一个问题,我没有看到它。请善意解释谢谢。 – thewayman