Écouter le port via un socket Java

Un logiciel serveur avec lequel mon client communique envoie régulièrement des messages de transaction sur le port 4000. J'ai besoin d'imprimer ces messages à la console ligne par ligne. (Finalement, je devrai écrire ces valeurs dans une table, mais je l'enregistre pour plus tard.)

J'ai essayé ce code mais il ne produit rien:

package merchanttransaction;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class MerchantTransaction {
    public static void main(String[] args) {
        try {
            InetAddress host = InetAddress.getLocalHost();
            Socket socket = new Socket("192.168.1.104", 4000);
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message: " + message);

            ois.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

En passant, je dois être capable de surveiller ce port jusqu'à la fin du programme. Je ne suis pas sûr si le code ci dessus sera capable de le faire parce que je n'en vois pas itération pour le code.

J'utilise Java version 1.6.0_24, SE Runtime Environment (build 1.6.0_24-b07) fonctionnant sur Ubuntu.

23
demandé sur Palec 2011-06-09 23:55:47

3 réponses

, Vous devez utiliser un ServerSocket. Vous pouvez trouver une explication ici.

23
répondu Howard 2011-06-09 20:00:32

Que voulez-vous réellement réaliser? Ce que votre code fait, c'est qu'il essaie de se connecter à un serveur situé à 192.168.1.104:4000. Est-ce l'adresse d'un serveur qui envoie les messages (car cela ressemble à un code côté client)? Si je lance un faux serveur localement:

$ nc -l 4000

...et changez l'adresse de socket en localhost:4000, cela fonctionnera et essaiera de lire quelque chose à partir du serveur nc Créé.

Ce que vous voulez probablement, c'est créer un ServerSocket et l'écouter:

ServerSocket serverSocket = new ServerSocket(4000);
Socket socket = serverSocket.accept();

La deuxième ligne bloquera jusqu'à un autre logiciel se connecte à votre machine sur le port 4000. Ensuite, vous pouvez lire à partir du socket retourné. Regardez ce tutoriel , c'est en fait un sujet très large (threading, protocoles...)

10
répondu Tomasz Nurkiewicz 2011-06-10 07:13:08

Essayez ce morceau de code, plutôt que ObjectInputStream.

BufferedReader in = new BufferedReader (new InputStreamReader (socket.getInputStream ()));
while (true)
{
    String cominginText = "";
    try
    {
        cominginText = in.readLine ();
        System.out.println (cominginText);
    }
    catch (IOException e)
    {
        //error ("System: " + "Connection to server lost!");
        System.exit (1);
        break;
    }
}
4
répondu LouwHopley 2011-06-09 20:01:13