使用socket通信,处理数据同步问题

愈来愈好 2016-12-16 03:54:14
使用socket通信接收到数据包,内容是对picturebox的属性设置,当接收的数据包内容多的时候,会处理140个picturebox,这个时候将数据包里面的内容复制到相应的picturebox需要一定的时间,但是发送端还是在发送数据包,接收端也在接受。
这时候就出现两个问题:
1.现在考虑同步,将数据包接收和picturebox属性设置写在了一个线程里面,接收多少内容处理多少内容。但是这样由于picturebox设置需要时间,接收到的数据包会出现粘包情况。但是如果将两个分开用两个线程来处理,则怎么实现同步呢?是要丢掉过时数据包还是提快处理picture的时间呢?
2.主要代码:
  public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
var length = socket.EndReceive(ar);
//读取出来消息内容
recStr = Encoding.Unicode.GetString(buffer, 0, length);
if (recStr.IndexOf("end", 0) == -1)//这里可能会出现多个结束终结符,因为有可能读取出来的信息有多条数据包了,这里要怎么处理呢?
{
sb.Append(recStr);

}
else
{
recStr = sb.ToString();//这里是不是应该加一个触发事件,执行到这里就触发另外处理picturebox线程里面的内容
dealPic(mf, recStr);//这段内容就是处理picturebox
sb.Clear();
}
//接收下一个消息
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
...全文
451 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
愈来愈好 2017-01-11
  • 打赏
  • 举报
回复
引用 3 楼 dongxinxi 的回复:
粘包跟你用几个线程处理没有关系,只不过可能用一个线程,粘的机率更大罢了。像这种吞吐量太大来不及处理,一般用的是队列,可以是分布式的,也可以横向集群负载。 比如msmq,如果对象数据包比较大,一个队列消息容不下,就需要多条(类似winrar的分卷),这时候最好启用事务,保证完整性 向队列发送消息可以看作是异步的,接收看作是同步的,在调用Receive之前先调用Peek来检索,否则在Receive时会阻塞
谢谢你的回答,但是我这个需要实时交互,MSMQ不适合于吧,还有其他办法么?要求实时交互然后数据量挺大的。
  • 打赏
  • 举报
回复
如果图省事,全部丢内存,当然可以。但如果堆积的包越来越多,最终程序也只能崩掉 道理还是一样,首先,正确拆包是前提,然后扔队列(Net中已经封装好线程安全的队列),处理线程独立开,从队列中去取
  • 打赏
  • 举报
回复
粘包跟你用几个线程处理没有关系,只不过可能用一个线程,粘的机率更大罢了。像这种吞吐量太大来不及处理,一般用的是队列,可以是分布式的,也可以横向集群负载。 比如msmq,如果对象数据包比较大,一个队列消息容不下,就需要多条(类似winrar的分卷),这时候最好启用事务,保证完整性 向队列发送消息可以看作是异步的,接收看作是同步的,在调用Receive之前先调用Peek来检索,否则在Receive时会阻塞
愈来愈好 2016-12-20
  • 打赏
  • 举报
回复
石沉大海。。。
堂风 2016-12-16
  • 打赏
  • 举报
回复
看你想要什么样的效果了。 1.dealPic(mf, recStr) 在这个函数里面对recStr进行拆分,然后再按照现有的逻辑走 2.把dealPic(mf, recStr);从ReceiveMessage里移除掉,改为一个消息的处理过程,例如加一个处理的函数,在拼包结束以后,对粘包进行处理,将处理的结果放到一个静态的队列里面。 添加一个线程或者Timer对上述队列进行取值操作,将取出的值赋给Pic 我能想到的就这样了

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧