UDPProvider和UDPSearcher的启动顺序

来源:3-5 案例实操-局域网搜索案例-1

黎明的烬

2018-10-24

请教下老师,为什么先UDPSearche在启动UDPProvider,两个线程就会阻塞呢?

写回答

4回答

Qiujuer

2018-10-24

不对哦 两个线程?可以截图一下么?
理论来说如果没有启动提供者,去搜索也是没有意义的。
所以是先启动提供者,然后启动搜索。

0
1
黎明的烬
是不是DatagramPacket.receive方法阻塞了、点进去看了下源码,说这个方法是会阻塞。。。。。
2018-10-24
共1条回复

Qiujuer

2018-10-24

哦 你说的这个哦 这个不是死锁。 这个是两个不同进程了,不是同进程之间的线程死锁。 

两个都不忘下走 只是因为两者都是使用的同步io,现在等于是在等待io返回而已。

但是又因为两者顺序不同完美的错过了,所以永远等不到数据到来。 

正确的顺序是:

提供者开启,并进入接收数据等待 
搜索者开启,并进入发布数据状态,然后等待返回 
此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据 

然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。 


而顺序错了就成了: 
搜索者发送数据,然后等待数据回来 
提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。 

所以搜索者也得不到数据了,然后两者就都GG了。

1
0

黎明的烬

提问者

2018-10-24

//img.mukewang.com/szimg/5bd04cc50001bd6e16240845.jpg

//img.mukewang.com/szimg/5bd04c8a0001f44b18200908.jpg

大概就是这样子

0
2
Qiujuer
格式丢失了,所以我在上面回复了一下。
2018-10-24
共2条回复

不想做程序猿

2018-10-24

先启动provider然后再启动searche

0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程