web-dev-qa-db-fra.com

Écoutez le port via un socket Java

Un logiciel serveur avec lequel mon client communique régulièrement envoie des messages de transaction sur le port 4000. Je dois imprimer ces messages ligne par ligne sur la console. (Finalement, je devrai écrire ces valeurs dans une table, mais je les 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();
        }
    }
}

Soit dit en passant, je dois pouvoir surveiller ce port jusqu'à la fin du programme. Je ne sais pas si le code ci-dessus pourra le faire, car je ne vois aucune itération dans le code.

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

26

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

25
Howard

Que voulez-vous réellement réaliser? Votre code essaie de se connecter à un serveur situé à 192.168.1.104:4000. S'agit-il de 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 du socket en localhost:4000, cela fonctionnera et essaiera de lire quelque chose à partir du serveur créé par nc.

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 se bloquera jusqu'à ce qu'un autre logiciel se connecte à votre machine sur le port 4000. Ensuite, vous pouvez lire à partir du socket retourné. Regardez this tutoriel, c'est en fait un sujet très large (threading, protocoles ...)

13

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
LouwHopley