我正在尝试实现一个简单的程序,它允许加入虚拟IP地址上的多播组并监听发送到该IP的数据包(这就是我创建类ThreadGroup
的原因)。
我的代码是:
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class MulticastTest {
private Set<Thread> threads;
public MulticastTest(){
threads = new HashSet<Thread>();
}
/**
* @param args
*/
public static void main(String[] args) {
MulticastTest test = new MulticastTest();
test.joinGroup("dogg",test.createAdr(),32445);
}
private void joinGroup(String name, String adr, int port){
try {
MulticastSocket multi = new MulticastSocket(port);
multi.joinGroup(InetAddress.getByName(adr));
ThreadGroup newThread = new ThreadGroup(multi);
threads.add(newThread);
newThread.start();
System.out.println("Congrats you joined the group "+name+".");
}catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
}
private String createAdr(){
Random r = new Random();
return r.nextInt(16)+224 + "." + r.nextInt(256) + "." + (r.nextInt(255)+1) + "." + r.nextInt(56);
}
/**
* Thread to receive datagram that are sent to the group
*/
class ThreadGroup extends Thread {
MulticastSocket multiSocket;
public ThreadGroup(MulticastSocket m) throws IOException{
multiSocket = m;
start();
}
public void run() {
DatagramPacket message;
byte[] contMessage;
String texte;
while(true) {
contMessage = new byte[1024];
message = new DatagramPacket(contMessage, contMessage.length);
try {
multiSocket.receive(message);
texte = (new DataInputStream(new ByteArrayInputStream(contMessage))).readUTF();
System.out.println(texte);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
因此,在我的 main 中,我尝试连接到随机多播 InetAddress
并等待数据包。但是当我运行我的程序时,我得到:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:705)
at MulticastTest.joinGroup(MulticastTest.java:35)
at MulticastTest.main(MulticastTest.java:25)
有人可以向我解释一下我做错了什么吗?
最佳答案
您在线程上调用 start()
两次,一次在构造函数中,一次在 joinGroup()
中。从构造函数中删除 start()
,这样您就可以通过 IllegalThreadSTateException
。
关于java - Java 中的线程和多播返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27176156/