Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.io.IOException:Can';t使用DatagramSockets分配请求的地址_Java_Sockets_Client_Ioexception - Fatal编程技术网

java.io.IOException:Can';t使用DatagramSockets分配请求的地址

java.io.IOException:Can';t使用DatagramSockets分配请求的地址,java,sockets,client,ioexception,Java,Sockets,Client,Ioexception,我有一个Java电子表格应用程序,它提供的一个特性(我开发的)是工作表共享。基本上,任何人都可以是客户端或服务器,因为应用程序既有服务器代码,也有客户端代码。作为服务器的用户创建共享,指定IP,然后创建并激活共享(最佳情况下),服务器在其IP和选定端口上侦听客户端 对于自动发现,我通过UDP广播使用DatagramSockets,而“真正的通信”是基于TCP的(在客户端已经连接之后) 我已经有了将活动共享列表从服务器发送到客户端的代码(它发送了InetSocketAddress的list) 服务

我有一个Java电子表格应用程序,它提供的一个特性(我开发的)是工作表共享。基本上,任何人都可以是客户端或服务器,因为应用程序既有服务器代码,也有客户端代码。作为服务器的用户创建共享,指定IP,然后创建并激活共享(最佳情况下),服务器在其IP和选定端口上侦听客户端

对于自动发现,我通过UDP广播使用DatagramSockets,而“真正的通信”是基于TCP的(在客户端已经连接之后)

我已经有了将活动共享列表从服务器发送到客户端的代码(它发送了
InetSocketAddress
list

服务器:

public class BroadcastList implements Runnable {
        private final int BROADCAST_PORT = 8888;

        public BroadcastList() {
        }

        @Override
        public void run() {
            try {
                ActiveShareList asl = new ActiveShareList();
                List<InetSocketAddress> shareList = asl.getActiveShareList();
                DatagramSocket broadcast = new DatagramSocket(BROADCAST_PORT);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ObjectOutputStream outputStream = new ObjectOutputStream(out);
                outputStream.writeObject(shareList);
                outputStream.close();

                byte[] listData = out.toByteArray();
                byte[] message = new byte[10];

                DatagramPacket listPacket = new DatagramPacket(listData, listData.length);
                DatagramPacket messagePacket = new DatagramPacket(message, message.length);

                broadcast.receive(messagePacket);
                broadcast.send(listPacket);

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
public类BroadcastList实现可运行{
专用最终int广播端口=8888;
公共广播列表(){
}
@凌驾
公开募捐{
试一试{
ActiveShareList asl=新的ActiveShareList();
List shareList=asl.getActiveShareList();
DatagramSocket广播=新的DatagramSocket(广播端口);
ByteArrayOutputStream out=新建ByteArrayOutputStream();
ObjectOutputStream outputStream=新的ObjectOutputStream(输出);
outputStream.writeObject(共享列表);
outputStream.close();
字节[]listData=out.toByteArray();
字节[]消息=新字节[10];
DatagramPacket listPacket=新的DatagramPacket(listData,listData.length);
DatagramPacket messagePacket=新的DatagramPacket(message,message.length);
广播接收(报文包);
广播发送(列表包);
}捕获(IOEX异常){
例如printStackTrace();
}
}
}
客户:

public void getShareList() {
        DatagramSocket socket;
        try {
            InetSocketAddress address = new InetSocketAddress("255.255.255.255", 8888);
            socket = new DatagramSocket();

            byte[] buffer = new byte[10];
            List<InetSocketAddress> shareList = new ArrayList<InetSocketAddress>();
            byte[] listData = new byte[65535];
            DatagramPacket messagePacket = new DatagramPacket(buffer, buffer.length, address.getAddress(), address.getPort());
            DatagramPacket listPacket = new DatagramPacket(listData, listData.length);

            socket.send(messagePacket);
            socket.receive(listPacket);
            ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(listData));

            try {
                shareList = (List<InetSocketAddress>) inputStream.readObject();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(JoinShareAction.class.getName()).log(Level.SEVERE, null, ex);
            }

}
public void getShareList(){
DatagramSocket套接字;
试一试{
InetSocketAddress地址=新的InetSocketAddress(“255.255.255.255”,8888);
套接字=新的DatagramSocket();
字节[]缓冲区=新字节[10];
List shareList=new ArrayList();
字节[]列表数据=新字节[65535];
DatagramPacket messagePacket=新的DatagramPacket(buffer,buffer.length,address.getAddress(),address.getPort());
DatagramPacket listPacket=新的DatagramPacket(listData,listData.length);
socket.send(messagePacket);
socket.receive(listPacket);
ObjectInputStream inputStream=新的ObjectInputStream(新的ByteArrayInputStream(listData));
试一试{
shareList=(List)inputStream.readObject();
}捕获(ClassNotFoundException ex){
Logger.getLogger(JoinShareAction.class.getName()).log(Level.SEVERE,null,ex);
}
}
问题在于客户端,它给了我一个
java.io.IOException:无法分配请求的地址
这行错误:
socket.send(messagePacket);


有人知道问题出在哪里吗?

广播到255.255.255.255已经被弃用了大约20年。请使用子网广播地址。我尝试了您的示例。但我没有收到任何错误。该程序停止在socket.send(messagePacket)