所以我试图通过使用套接字创建类似同步绘制程序的东西。我有一个服务器端...和客户端,我正在尝试将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:现有连接被强制关闭远程主机。
但是,如果你们有更好的方法来做这件事,那就太棒了......这是我缺少的东西吗?我的意思是..如果它适用于转换为字节数组的文本...为什么它适用于此笔画收集?
谢谢!
编辑:你认为你可以用一些示例代码帮助我吗?我似乎真的无法实现它;答案 0 :(得分:2)
您忘了设计或实施协议!你不能只通过TCP发送一堆字节,并假设接收器能够理解它。
您有一个应用程序消息,其中包含您尝试通过TCP发送的一组笔划。但TCP是字节流服务,而不是应用程序消息服务。因此,您需要某种应用程序消息协议来打包邮件以进行传输,并在收到时将其解包。但是你没有写过任何这样的代码。所以你基本上期待它能够通过魔法发挥作用。
定义协议。例如,它可能会说:
画布笔划应由表示画布笔划的“1”字节发送,后跟4个字节,以网络字节顺序指示笔画对象中的字节数,然后是笔画数据。接收器将读取第一个字节并识别它是画布笔画对象。然后接收器将读取接下来的四个字节以确定长度。接收器应累积该字节数(必要时使用多次读取),然后处理重建的画布笔画对象。
请勿跳过创建书面协议定义的步骤。
然后,当您遇到问题时,请按照这个方便的故障排除指南进行操作:
发件人是否遵循规范?如果没有,请停止,发件人已损坏。
接收器是否符合规范?如果没有,停止,接收器坏了。
停止,规范被破坏。
如果您想要简单,可以将数据转换为base64并将每条消息编码为一行文本。这将允许您使用ReadLine
函数来获取一条消息。然后你可以使用像“S”(用于“笔画”)的消息格式,然后使用base64格式的数据。使用WriteLine
功能发送短信后跟换行符。
答案 1 :(得分:0)
我认为您忘记设置内存流的位置。您应该在发送流之前将内存流位置设置为0,因为在strokes.save之后,流的位置在末尾。