0

我正在编写一个基本应用程序,一个聊天,它根据情况使用多播和单播通过网络发送消息。到目前为止,没有问题,直到前一段时间我开始 MulticastSocket 部分。运行此基本代码时出现 BindException(我删除了与我的问题部分无关的所有其他方法):

private MulticastSocket socket_multicast;
private int port;
private InetAddress multicast_address;

public void setPort(int p) {
    port = p;
}

public void setMulticastAddress(String s) {
    try {
        multicast_address = InetAddress.getByName(s);
    } catch (IOException e) {
         e.printStackTrace();
    }
}

public void joinGroup() {

    System.out.println("Port : "+port+"\n @IP : "+multicast_address+"\n");
    try {
        socket_multicast = new MulticastSocket(port);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        socket_multicast.joinGroup(multicast_address);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当我运行这段代码时,出现以下错误(我将 225.1.1.1 和 4567 放在 GUI 中):

 Port : 4567
 @IP : /225.1.1.1
 java.net.BindException: Address already in use
 at java.net.PlainDatagramSocketImpl.bind0(Native Method)
 at       
 java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:85)
 at java.net.DatagramSocket.bind(DatagramSocket.java:373)
 at java.net.MulticastSocket.<init>(MulticastSocket.java:165)
 at java.net.MulticastSocket.<init>(MulticastSocket.java:130)
 at networkinterface.MulticastIF.joinGroup(MulticastIF.java:61)

无论我放置哪种 IP 和端口组合,总是会得到相同的错误。我什至重新启动了我的电脑,它没有做任何改变。

注意:要测试,我在我的类中右键单击包视图中的 main,然后“运行为 -> Java 应用程序”。当我这样做时,Eclipse 会制作某种虚拟机,还是只使用环回地址 127.0.0.1 或其他什么?当我打印 InetAddress.getLocalHost() 的结果时;我有“akee-netbook/127.0.1.1”。由于我使用单播和多播,也许它只使用环回地址,并尝试绑定已经绑定的地址。如果是这样,我该如何正确测试我的应用程序?我不知道我是否清楚,如果没有,请告诉我!

最后一件事,为什么我打印我的 IP 地址时会有斜线?以后会不会有问题?还是来自 toString() 方法?

4

3 回答 3

0

呵呵,我知道我哪里错了。我正在使用带有@IP/port 的UDP 套接字(DatagramSocket),然后我尝试使用MulticastSocket 在同一个@IP/port 上再次绑定。因为多播使用 UDP,我假设我可以为单播和多播流量使用相同的套接字,它似乎不是那样工作的。无论如何,感谢您的回答,很抱歉花时间解决一个 n00b 问题,用两个字符解决:

    socket_multicast = new MulticastSocket(port);

替换为

    socket_multicast = new MulticastSocket(port+1);

-_-”

于 2011-05-04T10:40:41.887 回答
0

你是在linux系统上运行的吗?如果是这样,您是否将多播编译到内核中或为其加载了模块?

于 2011-05-03T21:40:40.403 回答
0

关于 toString(),请参阅InetAddress.toString()的 javadocs

于 2011-05-03T21:41:40.197 回答