2014-04-15 14 views
2

자바 멀티 캐스트 모드 프로그래밍을 사용하여 음성 채팅을 구현하려고합니다. 마이크에서 입력을 받아서 스피커에서들을 수 있습니다. 문제는 음성을들을 수 없습니다. 나는 그것을 통해 wireshark를 디버깅하고 내가 멀티 캐스트 그룹 주소로 패킷을 보낼 수 있고 내가 메시지를 볼 수 있지만 멀티 캐스트 그룹 주소에서 오는 패킷이 없음을 알 수 있습니다. 아무도 코드를보고 제게 잘못하고 있다면 알려주실 수 있습니까? 미리 감사드립니다.멀티 캐스트 프로그래밍을 사용하는 자바 음성 채팅

/보낸 코드/

공용 클래스 MulticastAudioSender {

public static final int IPM_PORT = 7778; 

public static final String IPM_ADDRESS = "235.1.1.1"; 

public static final int SLEEP_MILLISECS = 1000; 

private MulticastSocket sock; 

private DatagramPacket sendPack; 

public static final int BUFFER_SIZE = 20000; 

public MulticastAudioSender(){ 

    try { 
     sock = new MulticastSocket(); 
    } catch(Exception e) { 
     System.out.println("Exception in creating socket or packet: " 
       + e.getMessage()); 
    } 
} 

private void sendMessage(byte[] soundData, int length) { 
    try { 
     sendPack = new DatagramPacket(soundData, length, 
       InetAddress.getByName(IPM_ADDRESS), IPM_PORT); 
     sock.send(sendPack); 
     //System.out.println("Message sent."); 
    } catch(Exception e) { 
     System.out.println("Exception in sending packet: " 
       + e.getMessage()); 
    } 
} 

public static void main(String[] args) throws Exception{ 

    MulticastAudioSender sender = new MulticastAudioSender(); 
    AudioFormat af = new AudioFormat(8000.0f,8,1,true,false); 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, af); 
    TargetDataLine microphone = (TargetDataLine)AudioSystem.getLine(info); 
    microphone.open(af); 
    microphone.start(); 
    int bytesRead = 0; 
    byte[] soundData = new byte[1]; 
    //sender.receiveMessage(); 
    while(bytesRead != -1) { 
     bytesRead = microphone.read(soundData, 0, soundData.length); 
     if(bytesRead >= 0){ 
      sender.sendMessage(soundData, soundData.length); 
     } 
    } 
} 

}

/수신기 코드/

공용 클래스 IPMulticastReceiver {

,451,515,
public static final int IPM_PORT = 7778; 

public static final String IPM_ADDRESS = "235.1.1.1"; 

public static final int BUFFER_SIZE = 200; 

private MulticastSocket sock; 

private DatagramPacket pack; 

private byte[] receiveBuffer; 

byte[] inSound; 
SourceDataLine inSpeaker = null; 

public IPMulticastReceiver(){ 

    try { 
     sock = new MulticastSocket(IPM_PORT); 
     sock.joinGroup(InetAddress.getByName(IPM_ADDRESS)); 

     AudioFormat af = new AudioFormat(8000.0f,8,1,true,false); 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, af); 
     inSpeaker = (SourceDataLine)AudioSystem.getLine(info); 
     inSpeaker.open(af); 

    } catch(Exception e) { 
     System.out.println("Exception in creating Socket or Packet: " 
       + e.getMessage()); 
    } 
} 

private void receiveMessage() { 
    try { 
     receiveBuffer = new byte[BUFFER_SIZE]; 
     //sock.joinGroup(InetAddress.getByName(IPM_ADDRESS)); 
     pack = new DatagramPacket(receiveBuffer, receiveBuffer.length); 
     sock.receive(pack); 
     /*Thread inThread = new Thread(new MultiCastSoundReceiver(receiveBuffer)); 
     inThread.start();*/ 
     inSpeaker.write(receiveBuffer, 0, receiveBuffer.length); 
     inSpeaker.drain(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
     System.out.println("Exception in receiving packet: " 
       + e.getMessage()); 
    } 
} 

public static void main(String[] args) throws LineUnavailableException { 
    IPMulticastReceiver receiver = new IPMulticastReceiver(); 

    while(true) { 
     receiver.receiveMessage(); 
    } 
} 

}

답변

0

당신의 소켓에 setReuseAddr() 방법을 사용해보십시오 :

sock.setReuseAddress(true); 

JavaDoc에서 말 :

활성화/SO_REUSEADDR 소켓 옵션을 유효 또는 무효로합니다. UDP 소켓의 경우 동일한 소켓 주소에 둘 이상의 소켓을 바인드하는 데 이 필요할 수 있습니다. 이것은 일반적으로 멀티 캐스트 패킷을 수신하기위한 것입니다 ( MulticastSocket 참조). bind (SocketAddress)를 사용하여 소켓을 바인딩하기 전에 SO_REUSEADDR 소켓 옵션을 사용하면 SO_REUSEADDR 소켓 옵션을 사용하면 여러 소켓을 동일한 소켓 주소에 바인딩 할 수 있습니다.

참고 :이 기능은 모든 기존 플랫폼 ( )에서 지원되지 않으므로이 옵션을 무시할지 여부는 구현에 따라 다릅니다. . 그러나 지원되지 않는 경우 getReuseAddress()는 항상 이 false를 반환합니다.

+1

안녕하세요, 답변 주셔서 감사합니다.하지만 여전히 멀티 캐스트 그룹 주소에서 패킷을 다시받지 못합니다. 프로그램에 다른 결함이 있습니까? – SMM