Ne pas recevoir de réponse envoi de XML via TCP / IP en utilisant Java


Je suis nouveau sur Java (j'ai dû l'apprendre à la volée pour ce projet), mais j'essaie d'envoyer une commande XML à un serveur (un capteur dans mon laboratoire) pour en obtenir des données. Pour ce faire, j'ai écrit un programme Java et je l'exécute à partir de la ligne de commande. La connexion s'établit avec succès, et (je pense) le message est envoyé avec succès - mais il reste bloqué "En attente d'une réponse".

Voici mon code Java pour référence. J'ai obtenu la plupart de cela d'un client / serveur Tutoriel TCP, et ajusté l'IP, le port et le message sortant en conséquence. Encore une fois, je suis très nouveau dans ce domaine, donc toute aide est appréciée.

// Java Socket Example - Client

import java.io.IOException; // Throws exception if there is an issue with input or output
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress; // This class represents an Internet Protocol address
import java.net.Socket;
import java.net.UnknownHostException;

/**
* This class implements java socket Client
*/

public class SocketClientExample {
	public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException {
		// get the localhostIP address, if server is running on some other IP, use that 
		System.out.println("Attempting connection to GE Reuter Stokes");
		InetAddress host = InetAddress.getByName("10.212.160.4"); // IP GOES HERE
		Socket socket = null; // start out as null, protocal
		ObjectOutputStream oos = null; // This will change, just setting default
		ObjectInputStream ois = null;
		// establish the socket connection to the server
		socket = new Socket("10.212.160.4", 3010); // 9876 is just the port number
		System.out.println("Made it past Socket Initialization");
		// write to socket using ObjectOutputStream
		oos = new ObjectOutputStream(socket.getOutputStream()); // new instance of OOS that will write to the socket
		System.out.println("Sending request to Socket Server"); 
		// Initializing request string
		String request = new String("0xF00041 " + "<Discovery><CommChannelName>Unknown</CommChannelName></Discovery>");
		// In our version, this is where the XML script would go
		oos.writeObject(request);
		System.out.println("Request was sent. Awaiting response.");
		// read the server response message
		ois = new ObjectInputStream(socket.getInputStream());
		// convert the response into a string
		String message = (String) ois.readObject();
		System.out.println("Message: " + message);
		// close your resources
		ois.close();
		oos.close();
		Thread.sleep(100);
	}
}

C'est plus que probablement quelque chose avec le capteur - mais j'ai pensé que ça ne ferait pas de mal d'avoir un deuxième regard sur le code.

Author: Becca Lynch, 2016-08-04

1 answers

Le capteur s'attend à ce que le XML soit précédé d'un en-tête binaire de 5 octets, mais vous envoyez l'en-tête sous la forme d'une chaîne codée à 8 caractères hexadécimaux à la place.

De plus, vous utilisez ObjectOutputStream et ObjectInputStream, qui sont destinés à sérialiser des objets Java, mais vous n'envoyez/ne lisez pas d'objets Java. Ce sont donc les classes de flux complètement incorrectes à utiliser.

Donc, votre code n'envoie pas ce que le capteur attend, donc il ne recevra pas votre demande correctement, encore moins envoyer une réponse que vous pouvez recevoir.

Essayez quelque chose de plus comme ceci à la place (en supposant que le capteur renvoie une réponse dans un en-tête+format XML similaire à la demande):

import java.io.IOException;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import jva.io.BufferedInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.nio.ByteBuffer;

public class SocketClientExample {
    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException {
        System.out.println("Attempting connection to GE Reuter Stokes");

        // establish the socket connection to the server
        // using the local IP address, if server is running on some other IP, use that 
        Socket socket = new Socket("10.212.160.4", 3010);
        System.out.println("Socket Connected");

        // write to socket using OutputStream
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

        // Initializing request content
        byte[] request = "<Discovery><CommChannelName>Unknown</CommChannelName></Discovery>".getBytes(StandardCharsets.UTF_8);

        // DataOutputStream.writeInt() writes in big endian and
        // DataInputStream.readInt() reads in big endian.
        // using a ByteBuffer to handle little endian instead.

        byte[] header = new byte[5];
        ByteBuffer buf = ByteBuffer.wrap(header, 1, 4);
        buf.order(ByteOrder.LITTLE_ENDIAN);

        // Initializing request header
        header[0] = (byte) 0xF0;
        buf.putInt(request.length);

        System.out.println("Sending request to Socket Server"); 

        // Sending request
        dos.write(header);
        dos.write(request);
        dos.flush();

        System.out.println("Request was sent. Awaiting response.");

        // read from socket using InputStream
        DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

        // Read response header
        dis.readFully(header);
        buf.flip();

        // Read response content
        byte[] response = new byte[buf.getInt()];
        dis.readFully(response);

        // convert the content into a string
        String message = new String(response, StandardCharsets.UTF_8);
        System.out.println("Message: " + message);

        // close your resources
        dis.close();
        dos.close();
        socket.close();

        Thread.sleep(100);
    }
}
 1
Author: Remy Lebeau, 2016-08-06 00:48:47