现在我有一个设备向多播组发送 UDP 消息。我编写了一个小型 Java 程序,它可以通过加入组并查找正确的端口来检测这些数据包。我用MulticastSocket.receive(packet);
命令。为此,我将继续编写带有 GUI 的程序。我希望用户能够指定一段时间,并让我的程序在这段时间内查找数据包。我做了很多研究,发现最好的方法是在阻塞端口时切断接收命令,过早关闭端口。为了做到这一点,我让我的程序打开另一个线程,并在我的主线程休眠指定的时间时使用新线程来监视 UDP 数据包。它检测数据包就好了。但是,我似乎无法从主线程访问它来关闭端口。这是我的代码:
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
public class MulticastClient_v2 extends Thread
{
public volatile MulticastSocket socket;
public void run()
{
try {
//Declare the port and IGMP Group IP
MulticastSocket socket2 = new MulticastSocket(5000);
InetAddress address = InetAddress.getByName("224.0.1.2");
//Display connection information
System.out.println("Joining 224.0.1.2 on port 5000");
//Join the Multicast Group
socket.joinGroup(address);
//Declaring a DatagramPacket
DatagramPacket packet;
//Starting an infinite loop
//while (true)
//{
System.out.println("Waiting on packets..");
byte[] buf = new byte[1024];
packet = new DatagramPacket(buf, buf.length); //Declaring an internal DatagramPacket
socket.receive(packet); //Receiving a Packet
String received = new String(packet.getData(), 0, packet.getLength());
InetAddress senderAddress = packet.getAddress(); //Get the InetAddress object
String forFun = senderAddress.getHostAddress(); //Extract the IP address of sender in text format
if (received.indexOf("Product1") >= 0) //Searching the raw data for "Product1"
{
//If found, display the IP and device type
System.out.println("Product1 found at " + senderAddress);
}
if (received.indexOf("Product2") >= 0) //Searching the raw data for "Product2"
{
//If found, display the IP and device type
System.out.println("Product2 found at " + senderAddress);
}
//}
}
catch(IOException ex)
{
System.out.println (ex.toString());
}
}
public static void main(String[] args)
{
MulticastClient_v2 thread = new MulticastClient_v2();
thread.start();
try {
Thread.sleep( 3000 );
thread.socket2.close();
}
catch(InterruptedException in)
{
System.out.println("Interrupted Exception!");
}
System.out.println("Done.");
}
}
因此,当我尝试编译时,出现以下错误:
MulticastClient_v2.java:63: error: cannot find symbol
thread.socket2.close();
^
symbol: variable socket2
在我看来,主要方法无法使用另一种方法看到 socket2。我的问题是如何让它可以看到?我尝试了一下
public volatile MulticastSocket socket;
并且main方法可以访问它,但是我在run方法时无法连接到某个端口。我能找到的唯一可以做到这一点的是bind()。但是 bind() 需要 IP 和端口,而当我第一次声明多播套接字时,我可以像这样声明端口:
MulticastSocket socket2 = new MulticastSocket(5000);
任何帮助将不胜感激!我已经坚持了一段时间了。
编辑:我得到了一些建议。首先,我应该在类级别声明和初始化,这给了我以下 IO 错误:
MulticastClient_v2.java:8: error: unreported exception IOException; must be caught
or declared to be thrown
public volatile MulticastSocket socket = new MulticastSocket(5000);
^
所以接下来,我试着把它放在类级别的 try..catch 块中,我得到了这个:
MulticastClient_v2.java:8: error: illegal start of type
try{
^
所以我想我真正需要做的是在类级别初始化多播端口,然后将它放在方法内的 try 块中,正如 JTMon 建议的那样。但是我想不出一种方法来选择它的端口而不在初始化期间这样做。
编辑2:我仍然有困难。如果我尝试在类级别像这样初始化它:
public volatile MulticastSocket socket;
以后如何在 run() 方法中编辑其端口?