我正在为android编写一个java套接字程序:
DeviceManagerWindow.java
public class DeviceManagerWindow extends Activity
{
Thread sendMulticast;
...
...
WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null)
{
WifiManager.MulticastLock lock = wifi.createMulticastLock("WifiDevices");
lock.acquire();
}
public void searchDevice(View view)
{
sendMulticast = new Thread(new MultiCastThread());
sendMulticast.start();
ExecutorService executorService = Executors.newFixedThreadPool(1);
List<Future<DeviceDetails>> deviceList = new ArrayList<Future<DeviceDetails>>();
Callable<DeviceDetails> device = new MulticastReceiver();
Future<DeviceDetails> submit = executorService.submit(device);
deviceList.add(submit);
DeviceDetails[] devices = new DeviceDetails[deviceList.size()];
int i=0;
for(Future<DeviceDetails> future :deviceList)
{
try
{
devices[i] = future.get();
}
catch(Exception e)
{
Log.v("future Exception: ",e.toString());
}
}
listAllDevices(devices);
}
}
在接收器类中,我有以下代码:
MultivastReceiver.java
public class MulticastReceiver implements Callable<DeviceDetails>
{
DatagramSocket socket = null;
DatagramPacket inPacket = null;
public MulticastReceiver()
{
try
{
socket = new DatagramSocket(5500);
}
catch(Exception ioe)
{
System.out.println(ioe);
}
}
@Override
public DeviceDetails call() throws Exception
{
// TODO Auto-generated method stub
try
{
byte[] inBuf = new byte[WifiConstants.DGRAM_LEN];
//System.out.println("Listening");
inPacket = new DatagramPacket(inBuf, inBuf.length);
socket.receive(inPacket);
String msg = new String(inBuf, 0, inPacket.getLength());
Log.v("Received: ","From :" + inPacket.getAddress() + " Msg : " + msg);
DeviceDetails device = getDeviceFromString(msg);
return device;
}
catch(Exception e)
{
Log.v("Receiving Error: ",e.toString());
return null;
}
}
public DeviceDetails getDeviceFromString(String str)
{
String type;
String IP;
type=str.substring(0,str.indexOf('`'));
str = str.substring(str.indexOf('`')+1);
IP=str;
DeviceDetails device = new DeviceDetails(type,IP);
return device;
}
}
现在,上面的代码仅在收到第一个数据包时搜索第一个数据包,它会停止搜索下一个数据包。我想让它听取传入的数据包30秒,然后退出,并收到它收到的所有数据。怎么做。
如果我使用无限循环,那么它将永远不会返回该值,因为return语句将放在循环之外,如果我将return语句放在循环中,它将返回值并且永远不会等待下一个数据包到来。
答案 0 :(得分:1)
有两种可能性。
您可以在30秒后将套接字设置为超时。不幸的是,每次收到新消息时都会重置。因此,如果您知道所有消息将在30秒内到达,则只需设置超时,并且套接字最终会在收到最后一个数据包后超时。
第二个选项是使用单独的TimerTask来唤醒您的客户端,以便它不会无限期地在接收中被阻止。您将需要从应该执行此任务的计时器任务中断客户端线程。
在这两种情况下,您都需要处理适当的例外来处理超时。
答案 1 :(得分:0)
创建一个默认为false的“cancel”布尔属性,并运行while循环,直到该属性设置为true。然后我们用timer在30秒后将“取消”设置为真。
答案 2 :(得分:0)
我已经给你代码here ...
我猜这是同样的问题。没有标记它。!!看看你认为它没问题。