Подтвердить что ты не робот

Прослушать порт через сокет Java

Серверное программное обеспечение, с которым мой клиент взаимодействует, регулярно отправляет сообщения транзакций на порт 4000. Мне нужно печатать эти сообщения в консоли по очереди. (В конце концов мне придется записывать эти значения в таблицу, но Im сохраняет это для более поздних версий.)

Я пробовал этот код, но он ничего не выводит:

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();
        }
    }
}

Кстати, мне нужно контролировать этот порт, пока программа не завершится. Я не уверен, что код выше сможет это сделать, потому что я не вижу никакой итерации кода.

Im с использованием Java версии 1.6.0_24, среды выполнения SE (build 1.6.0_24-b07), запущенной на Ubuntu.

4b9b3361

Ответ 1

Вам нужно использовать ServerSocket. Вы можете найти объяснение здесь.

Ответ 2

Чего вы на самом деле хотите достичь? Что делает ваш код, он пытается подключиться к серверу, расположенному в 192.168.1.104:4000. Является ли это адресом сервера, который отправляет сообщения (потому что это похоже на клиентский код)? Если я запускаю поддельный сервер локально:

$ nc -l 4000

... и измените адрес сокета на localhost:4000, он будет работать и попытаться прочитать что-то из nc -созданного сервера.

То, что вы, вероятно, хотите, это создать ServerSocket и прослушать его:

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

Вторая строка будет блокироваться до тех пор, пока какая-либо другая часть программного обеспечения не подключится к вашей машине на порту 4000. Затем вы можете прочитать из возвращенного сокета. Посмотрите этот учебник, это на самом деле очень широкая тема (потоки, протоколы...)

Ответ 3

Попробуйте этот фрагмент кода, а не 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;
    }
}