通过套接字发送墨迹描边

时间:2012-04-12 23:40:44

标签: c# wpf sockets stroke inkcanvas

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

发送笔画:

        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(byte [] data):

 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时,它会失败。客户端上没有显示任何内容,我在服务器端获得以下SocketException:现有连接被强制关闭远程主机。

但是,如果你们有更好的方法来做这件事,那就太棒了......这是我缺少的东西吗?我的意思是..如果它适用于转换为字节数组的文本...为什么它适用于此笔画收集?

谢谢!

编辑:你认为你可以用一些示例代码帮助我吗?我似乎真的无法实现它;

2 个答案:

答案 0 :(得分:2)

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

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

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

  

画布笔划应由表示画布笔划的“1”字节发送,后跟4个字节,以网络字节顺序指示笔画对象中的字节数,然后是笔画数据。接收器将读取第一个字节并识别它是画布笔画对象。然后接收器将读取接下来的四个字节以确定长度。接收器应累积该字节数(必要时使用多次读取),然后处理重建的画布笔画对象。

请勿跳过创建书面协议定义的步骤。

然后,当您遇到问题时,请按照这个方便的故障排除指南进行操作:

  1. 发件人是否遵循规范?如果没有,请停止,发件人已损坏。

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

  3. 停止,规范被破坏。

  4. 如果您想要简单,可以将数据转换为base64并将每条消息编码为一行文本。这将允许您使用ReadLine函数来获取一条消息。然后你可以使用像“S”(用于“笔画”)的消息格式,然后使用base64格式的数据。使用WriteLine功能发送短信后跟换行符。

答案 1 :(得分:0)

我认为您忘记设置内存流的位置。您应该在发送流之前将内存流位置设置为0,因为在strokes.save之后,流的位置在末尾。