我正试图在我的mac上发送来自java的广播。这似乎应该可以工作,但我得到一个SecurityException。我已经确认没有安装SecurityManager,并尝试使用sudo运行我的类。
代码:
public static void main(String[] args) throws Exception{
SocketAddress sockAddr = new InetSocketAddress("192.168.0.255",
4000);
ByteBuffer bb = ByteBuffer.allocate(10);
bb.put(new Byte("1"));
DatagramChannel channel = DatagramChannel.open();
channel.send(bb, sockAddr);
}
例外:
Exception in thread "main" java.net.SocketException: Permission denied
at sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:301)
at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:281)
at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:250)
at Test.main(Test.java:15)
答案 0 :(得分:3)
做了一点谷歌搜索,你需要告诉套接字数据报通道正在使用它是一个使用代码的广播频道:
channel.socket().setBroadcast(true);
我认为只需要在'channel'上设置广播套接字选项,这是底层的O / S套接字。显然,一旦java7出现,这将在通道级别上可行,但是目前您需要访问DatagramSocket来设置参数。
答案 1 :(得分:0)
那是SocketException
而非SecurityException
(或AccessControlException
)。似乎操作系统不允许您的进程发送该数据报。