java - Java 中的线程和多播返回异常

标签 java multithreading sockets exception multicast

我正在尝试实现一个简单的程序,它允许加入虚拟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/

相关文章:

java - JAXB 解码时出错

java - 服务器客户端通信卡住`[命令提示符]

c++ - 接收二进制数据并写入(C++套接字编程)

c - http 服务器响应(套接字)的 header 和内容之间的区别

java - 如何在 Java 中创建临时目录/文件夹?

java - 在 IDE Netbeans 中从 java 连接到 MySQL 数据库

带有常量的 Java final 类

java - 如何到达第一个Java线程0?

java - 为什么 Object 成员变量在 Java 中不能既是 final 又是 volatile?

c++ - 如何正确关闭为使用 IOCP 创建的工作线程