私は Java でスプレッドシート アプリケーションを持っていますが、それが提供する (私が開発した) 機能の 1 つはシート共有です。基本的に、アプリにはサーバー コードとクライアント コードの両方があるため、誰でもクライアントまたはサーバーになることができます。サーバーであるユーザーが共有を作成し、IP を指定すると、共有が作成されてアクティブになり (最良のシナリオ)、サーバーはその IP と選択したポートでクライアントをリッスンします。
自動検出のために、UDP ブロードキャスト経由で DatagramSockets を使用していますが、「実際の通信」は TCP ベースです (クライアントが既に接続された後)。
サーバーからクライアントにアクティブな共有のリストを送信するためのこのコードが既にあります(List
ofを送信しますInetSocketAddress
)。
サーバー:
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 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);
}
}
問題はクライアントにあり、次のjava.io.IOException: Can't assign requested address
行にエラーが表示されます: socket.send(messagePacket);
。
何が問題なのか知っている人はいますか?