envoyer et recevoir des paquets UDP en utilisant Java?
j'ai créé un programme pour envoyer des paquets UDP d'un client vers un serveur. voici le code émetteur
import java.io.IOException;
import java.net.*;
/**
*
* @author hp
*/
public class JavaApplication9 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws UnknownHostException, SocketException, IOException {
// TODO code application logic here
byte[] buffer = {10,23,12,31,43,32,24};
byte [] IP={-64,-88,1,106};
InetAddress address = InetAddress.getByAddress(IP);
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, address, 57
);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(packet);
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
la fonction de code récepteur est
public void run(){
try{
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
byte[] sendData = new byte[8];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData());
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
String sendString = "polo";
sendData = sendString.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}catch (Exception e){
}
}
j'ai utilisé le programme WireShark . Le paquet UDP est reçu dans le programme WireShark du récepteur mais le programme Java ne le reconnaîtrait pas , le programme continue d'écouter le port et rien ne se passe ?
1 réponses
le récepteur doit configurer le port du récepteur pour qu'il corresponde au port défini dans le paquet de données sender. Pour le débogage, essayez l'écoute sur un port > 1024 (par exemple 8000 ou 9000). Les Ports < 1024 sont généralement utilisés par les services système et ont besoin d'un accès administrateur pour se lier sur un tel port.
si le récepteur envoie un paquet au port codé dur qu'il écoute (par exemple le port 57) et que l'expéditeur est sur la même machine, alors vous créerez un loopback pour le récepteur lui-même. Toujours utiliser le port spécifié dans le paquet et en cas de logiciel de production aurait besoin d'un contrôle dans tous les cas pour empêcher un tel cas.
une autre raison pour laquelle un paquet n'arrive pas à destination est la mauvaise adresse IP spécifiée dans l'expéditeur. UDP contrairement à TCP tentera d'envoyer un paquet même si l'adresse n'est pas accessible et l'expéditeur ne recevra pas d'indication d'erreur. Vous pouvez vérifier cela en imprimant l'adresse dans le récepteur à titre de précaution pour le débogage.
dans l'expéditeur vous set:
byte [] IP= { (byte)192, (byte)168, 1, 106 };
InetAddress address = InetAddress.getByAddress(IP);
mais pourrait être plus simple d'utiliser l'adresse sous forme de chaîne:
InetAddress address = InetAddress.getByName("192.168.1.106");
En d'autres termes, vous définissez la cible sous 192.168.1.106. Si ce n'est pas le récepteur, alors vous n'obtiendrez pas le paquet.
voici un récepteur UDP simple qui fonctionne:
import java.io.IOException;
import java.net.*;
public class Receiver {
public static void main(String[] args) {
int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
new Receiver().run(port);
}
public void run(int port) {
try {
DatagramSocket serverSocket = new DatagramSocket(port);
byte[] receiveData = new byte[8];
String sendString = "polo";
byte[] sendData = sendString.getBytes("UTF-8");
System.out.printf("Listening on udp:%s:%d%n",
InetAddress.getLocalHost().getHostAddress(), port);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(true)
{
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0,
receivePacket.getLength() );
System.out.println("RECEIVED: " + sentence);
// now send acknowledgement packet back to sender
InetAddress IPAddress = receivePacket.getAddress();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
}
} catch (IOException e) {
System.out.println(e);
}
// should close serverSocket in finally block
}
}