2012-04-12 136 views
1

所以我想通过使用套接字来创建类似于syncronized的绘制程序的东西。我有一个服务器端......并且客户端和我试图从服务器发送inkCollection到客户端。这适用于简单的文本,但我似乎无法发送inkCollection.Or它会更酷,如果你能帮我发送最后一招,以便数据传输更快。这里是我一直在尝试的代码:通过套接字发送inkcanvas笔画

发送笔划:

 byte[] data; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      inkcanvas.Strokes.Save(ms); 
      data = ms.ToArray(); 
     } 

     svr.SendToAll("u getting some strokes"); 
     svr.SendStrokes(data); 

svr.SendStrokes(字节[]数据):

public void SendStrokes(byte[] data) 
    { 
     for (int i = 0; i < no; i++) 
     { 
      byte[] dt = data; 
      accepted[i].Send(dt); 
     } 

      MessageBox.Show("dONE"); 
    } 

,这是对客户方:

byte[] buffer=new byte[1024]; 
       MessageBox.Show("receiving strokes"); 
       int rec = conn.Receive(buffer, 0, buffer.Length, 0); 
       if (rec <= 0) 
        throw new SocketException(); 
       MessageBox.Show("strokes received"); 
       //Array.Resize(ref buffer, rec); 
       using (MemoryStream ms = new MemoryStream(buffer)) 
       { 
        inkcanvas.Strokes = new System.Windows.Ink.StrokeCollection(ms); 
        ms.Close(); 
       } 
       MessageBox.Show("strokes added"); 

这些完全相同的方法很好地工作字符串,但是当我尝试用StrokeCollection中做到这一点,它fails.Nothing显示了客户端和我在服务器端获得以下SocketException:现有连接被远程主机强制关闭。

但是,如果你们有更好的方法如何做到这一点,这将是伟大的......这是我失踪的东西?我的意思是..如果它适用于文本转换成一个字节数组...为什么会这为strokecollection工作?

谢谢!

编辑:你认为你可以帮我拿出一些示例代码?我似乎无法实现它;

+0

您可能不会调用'Close'方法,因为在退出'using'语句之后将丢弃内存流 – VMAtm 2015-02-26 13:25:51

回答

2

你忘了设计或实施一个协议!你不能只通过TCP发送一串字节,并假定接收器能够从中理解。

您有一个应用程序消息,包含您尝试通过TCP发送的一组笔划。但是TCP是一种字节流服务,而不是应用程序消息服务。因此,您需要某种应用程序消息协议来打包传输的消息并在收到时将其解包。但是你还没有写过任何这样的代码。所以你基本上期望它能够通过魔法工作。

定义一个协议。例如,它可能会说:

画布描边应该由指示画布描边的'1'字节发送,然后是4个字节,指示网格字节顺序中描边对象中的字节数,然后是描边数据。接收器将读取第一个字节并确定它是一个画布描边对象。然后接收器将读取接下来的四个字节来确定长度。接收器应积累该字节数(如果需要,使用多次读取),然后处理重建的画布笔划对象。

不要跳过创建书面协议定义的步骤。

然后,当你有问题,请按照这个方便的故障排除指南:

  1. 是否发送者按照规范?如果没有,请停止,发件人已损坏。

  2. 接收机是否遵循规范?如果没有,停止,接收器坏了。

  3. 停止,规格被打破。

如果您想要简单,您可以将数据转换为base64并将每条消息编码为一行文本。这将允许您使用ReadLine函数来准确捕获一条消息。然后,您可以使用消息格式,如“S”(用于“笔划”),后跟base64格式的数据。使用WriteLine函数发送文本消息后跟一个换行符。