Перевести Action <String> с C# на Java

В настоящее время я пишу действительно простое TCP-соединение между C# (Host) и Java (Client)

Я борюсь с получением сообщений в java, я нашел (на мой взгляд) хорошее решение для C#. Я передаю ссылку на метод в конструкторе, который будет сохранен, позже, если будет получено сообщение, я могу просто вызвать этот метод из родительского класса.

Я хочу сделать то же самое в java, но понятия не имею, как это сделать!

В конце концов, я хочу иметь простой в использовании класс, как мне перезвонить в java.

Код сервера (C#)

class Server
    {

        private TcpListener serverSocket;
        private TcpClient clientSocket;
        private NetworkStream networkStream;

        private Action<string> outRecievedMethod;
        private Thread recievingRoutineThread;

        public Server(int port, Action<string> outRecievedMethod) {
            serverSocket = new TcpListener(IPAddress.Any,port);
            clientSocket = default(TcpClient);
            serverSocket.Start();
            clientSocket = serverSocket.AcceptTcpClient();
            networkStream = clientSocket.GetStream();
            this.outRecievedMethod = outRecievedMethod;
            recievingRoutineThread = new Thread(this.recievingRoutine);
            recievingRoutineThread.Start();
        }

        private void recievingRoutine()
        {
            while (true)
            {
                String recievingString = null;
                try
                {
                    recievingString = recieve();
                }catch (Exception ex) { }
                recievingString = recievingString.Replace("\0", "");
                if (recievingString != null && recievingString != "")
                    outRecievedMethod((String)recievingString.Clone()); 
            }
        }

        private string recieve()
        {
            byte[] bytesFrom = new byte[65536];
            networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
            string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
            return dataFromClient;
        }

        public void send(string msg)
        {...}

        public void send(byte[] msgBytes)
        {...}
    }

Клиентский код (Java)

private final String host;
    private Socket clientSocket;
    private OutputStream socketOutStream;
    private OutputStreamWriter osr;
    private BufferedWriter bw;

    private InputStream socketinstr;
    private InputStreamReader isr;
    private BufferedReader br;

    public Client(String ip, int port) throws IOException {
        host = ip;
        clientSocket = new Socket(ip,port);

        //init output
        socketOutStream = clientSocket.getOutputStream();
        osr = new OutputStreamWriter(socketOutStream);
        bw = new BufferedWriter(osr);
        //init Input
        socketinstr = clientSocket.getInputStream();
        isr = new InputStreamReader(socketinstr);
        br = new BufferedReader(isr);
        System.out.println("Connected to " + host + ":" + String.valueOf(port));
        Thread recievingRoutineThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    String recievingString = null;
                    try{ recievingString = recieve();
                    }catch(Exception ex) {}
                    if (recievingString != null && recievingString != "")
                        sendRecievedMessageOutside(recievingString);
                }
            }
        });
        recievingRoutineThread.start();
    }

    private void sendRecievedMessageOutside(String message){
         //here i want to callback a method passed in the construcktor
        //just like in c#

    }

    String recieve() throws IOException {
        char[] buff = new char[65536];
        while (br.ready()) {
            br.read(buff);
        }
        return new String(buff);
    }

    public boolean send(String msg) {...}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать java.util.function.Consumer. Передайте экземпляр потребителя конструктору клиента и вызовите метод accept потребителя при получении:

public class Client {
    private final Consumer<String> messageConsumer;

    public Client( String ip, int port, Consumer<String>  messageConsumer) throws IOException {
        this.messageConsumer = messageConsumer;
        Thread recievingRoutineThread = new Thread( new Runnable() {
            @Override
            public void run() {
                while(true) {
                    String recievingString = null;
                    try{ recievingString = recieve();
                    }catch(Exception ex) {}
                    if (recievingString != null && recievingString != "")
                        sendRecievedMessageOutside(recievingString);
                }
            }
        } );
        recievingRoutineThread.start();
    }
    private void sendRecievedMessageOutside(String message){
        messageConsumer.accept( message );
    }
}

спасибо, это именно то, что я искал, самый простой обратный вызов :)

Elias 15.08.2018 11:16

Другие вопросы по теме