2014-11-27 4 views
0

가상 IP 주소에서 멀티 캐스트 그룹에 가입하고이 IP로 전송 된 패킷을 수신 할 수있는 간단한 프로그램을 구현하려고합니다 (즉, 클래스를 만들었습니다. ThreadGroup).Java의 스레드 및 멀티 캐스트가 예외를 반환합니다.

내 코드는 다음과 같습니다

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(); 
       } 
      } 
     } 
    } 

} 

그래서 내 주에, 나는 임의의 멀티 캐스트 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) 

누군가 내가 뭘 잘못 나에게 설명 할 수 있을까요?

답변

2

귀하의 스레드에서 start()을 두 번 호출합니다 (생성자에서 한 번, joinGroup()에서 한 번). IllegalThreadSTateException을지나 가야하는 생성자에서 start()을 제거하십시오.

+0

글쎄, 문제 였어. 고마워. – Raoul722

0

시작 스레드가 두 번 있습니다. 1) 스레드 그룹 생성자 2) newThread.start();

중 하나를 사용하면 문제가 해결 될 수 있습니다.