2012-10-27 13 views
0

我有這段代碼,但它不能在2臺不同的計算機上工作,我更改了防火牆,但它不起作用。Java多點傳送在Windows中不起作用

import java.io.IOException; 
import java.lang.management.ManagementFactory; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.rmi.RMISecurityManager; 
import java.util.ArrayList; 
import java.util.HashMap; 

public class TestingDota{ 

private static String name; 
public static void main(String args[]){ 
    name = args[0]; 

    final InetAddress group; 
    final String address = "230.0.0.1"; 
    final int port = 9876; 
    try{ 
     group = InetAddress.getByName(address); 
    }catch(Exception e){ 
     e.printStackTrace(); 
     return; 
    } 
    HashMap<String, Tupla> map = new HashMap<String,Tupla>(); 
    try{ 
     final MulticastSocket socket = new MulticastSocket(port); 
     socket.setReuseAddress(true); 
     socket.joinGroup(group); 
     socket.setTimeToLive(2); 
     new Thread(){ 

      public void run(){ 
       while(true){ 
        String msg = ManagementFactory.getRuntimeMXBean().getName()+ "," + name; 
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.length(), group, port); 
        try { 
         socket.send(packet); 
         Thread.sleep(1000); 
        } catch (IOException e){ 
         e.printStackTrace(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 

       } 

      } 
     }.start(); 

     while(true){ 
      byte[] buf = new byte[512]; 
      DatagramPacket packet = new DatagramPacket(buf, buf.length); 
      socket.receive(packet); 
      String msg = new String(packet.getData()).trim(); 
      int index = msg.indexOf(','); 
      String key = msg.substring(0,index); 
      String name = msg.substring(index+1, msg.length()); 
      long time = System.currentTimeMillis(); 
      if(map.containsKey(key)){ 
       Tupla t = map.get(key); 
       t.time = time; 
      }else{ 
       Tupla t = new Tupla(); 
       t.name = name; 
       t.time = time; 
       map.put(key, t); 
       mostrar(map); 
      } 
      int size = map.size(); 
      ArrayList<String> list = new ArrayList<String>(); 
      for(String k : map.keySet()){ 
       Tupla t = map.get(k); 
       if(time - t.time> 1500){ 
        list.add(k); 
       } 
      } 
      for(String x : list) map.remove(x); 
      if(size > map.size()){ 
       mostrar(map); 
      } 
      Thread.sleep(100); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

private static void mostrar(HashMap<String, Tupla> map) { 
    for(String k : map.keySet()){ 
     Tupla t = map.get(k); 
     System.out.println(t.name); 
    } 
    System.out.println(); 
} 

static class Tupla{ 
    String name; 
    long time; 
} 
} 

運行此程序,請寫:$ java的TestingDota someName,其工作原理與在同一臺計算機上幾個終端,但它在diferent電腦不工作

+0

它可能是你的路由器。 AFAIK,大多數家庭路由器,甚至一些企業級路由器都不實現IP多播。 – GreyBeardedGeek

+0

在您已經將套接字綁定到端口之後調用setReuseAddress()完全沒有任何作用。 – EJP

回答

0

230.0.0.1是一個reserved multicast address。你不能使用它。

+0

我改變了它,但它不起作用,請你舉一個例子,上帝ip – user1351870

+0

@ user1351870這取決於你改變了它,不是嗎?當你閱讀我鏈接到你的頁面應該找到你的問題的答案。 – EJP