1

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

发送笔画:

        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 进行操作时,它失败了。客户端上没有显示任何内容,并且我在服务器端收到以下 SocketException:现有连接被远程主机强行关闭。

但是,如果你们有更好的方法来做到这一点,那就太好了……这是我想念的吗?我的意思是..如果它适用于转换为字节数组的文本...为什么它适用于这个笔画集合?

谢谢!

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

4

2 回答 2

2

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

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

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

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

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

然后,当您遇到问题时,请遵循此方便的故障排除指南:

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

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

  3. 别了,规范坏了。

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

于 2012-04-12T23:46:58.743 回答
0

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

于 2018-08-03T02:15:35.340 回答