Mam do napisania protokół wysyłający pliki oparty na UDP i z niewiadomych mi przyczyn dostaję taki wyjątek przy wywołaniu send(DatagramPacket p) z DatagramSocket:

Exception in thread "main" java.lang.IllegalArgumentException: connected address and packet address differ
        at java.net.DatagramSocket.send(Unknown Source)
...

Problem w tym, że jest to bug Javy bo ten wyjątek nawet nie jest opisany w dokumentacji, i według bugtracka dochodzi do niego gdy InetAddress w DatagramPacket jest taki sam jak w DatagramSocket. Dobra z tym mogę się zgodzić bo faktycznie testuje tylko na interfejsie localhost. A wygląda to tak:
Wysyłanie:

  • tworzenie socketu (public void sendFile(String filePath, String recvAddress, int recvPort) throws TimeoutException):
DatagramSocket datagramSoc = new DatagramSocket();
datagramSoc.connect(InetAddress.getByName(this.hostAddress),this.hostPort);
System.out.println("Socket port: "+datagramSoc.getPort());
System.out.println("Socket address: "+datagramSoc.getInetAddress().getHostAddress());
File file = new File(filePath);
if(!file.isFile()) {
    throw new IOException("Podana sciezka nie prowadzi do pliku");
}
VUDPSender sender = new VUDPSender(datagramSoc, file, recvAddress, recvPort);
sender.send();

-wysyłanie tablicy bytów używane w metodzie send() VUDPSender'a:

private void sendByteArray(byte[] bytes)
{
	System.out.println("Wysylam do:");
	System.out.println("- to: "+recv.getHostAddress());
	System.out.println("- port: "+this.recvPort);
	System.out.println("- pack: "+PackFactory.getTypeFromCode(bytes[0]));
	DatagramPacket dp = new DatagramPacket(bytes, bytes.length, recv, recvPort);
	if(socket.getInetAddress().equals(dp.getAddress())) {
		System.out.println("mamy problem");
	}
	try {
		socket.send(dp);
	}catch(IOException ex){
		System.err.println(ex);
	}
}
  • output
F:\Programowanie\Java>java pl.one.revis.net.udp.VUDPFileSender.StartSend 4000 localhost Okladka.jpg localhost 5000
Socket port: 4000
Socket address: 127.0.0.1
Wysylam do:
- to: 127.0.0.1
- port: 5000
- pack: START
mamy problem
Exception in thread "main" java.lang.IllegalArgumentException: ...

I odbieranie:

  • tworzenie socketu (public void recvFile() throws TimeoutException):
DatagramSocket datagramSoc = new DatagramSocket();//this.hostPort, InetAddress.getByName(hostAddress));
datagramSoc.connect(InetAddress.getByName(hostAddress),this.hostPort);
System.out.println("Socket port: "+datagramSoc.getPort());
System.out.println("Socket address: "+datagramSoc.getInetAddress().getHostAddress());
VUDPReceiver receiver = new VUDPReceiver(datagramSoc);
receiver.receive();
  • output
F:\Programowanie\Java>java pl.one.revis.net.udp.VUDPFileSender.StartRecv 5000 localhost
Socket port: 5000
Socket address: 127.0.0.1

No i faktycznie InetAddress jest ten sam... I tu wynika mój problem bo na ćwiczeniach pisaliśmy prosty program wysyłający Stringi przez UDP i na localhoście wszystko śmigało bezproblemowo. Gdzieś w tym moim rozumowaniu jest błąd, ale gdzie...

Edit---------------------
W teori powyższa sprawa została rozwiązana. Wspomniany wyjątek pojawia się gdy ustawimy socket jako connected co uniemożliwia wykonanie tego co robiłem. Praktycznie jednak ciągle nie mogę stworzyć działającego socketu ponieważ przy próbie wywołania metod getPort() i getInetAddress() dostaję -1 i null. A socket tworzę jako:

InetSocketAddress address = new InetSocketAddress(host,hostPort);
DatagramSocket socket = new DatagramSocket(address);

<span style="color: red"><i>Edit 2---------------------</i></span>
No i cały mozolny wywód i szukanie błędu mogę odstawić na bok. Jednak błąd który spowodował całe zajście miał zupełnie inne źródło które na początku źle zinterpretowałem i de'facto sam doprowadziłem do powyższej sytuacji z wyjątkiem Illegal i kolejnych błędów... Ale wszystko już powoli zaczyna się kręcić ;)