Отправить байтовый массив из Java-программы на C ++

0

В настоящее время я изучаю сети и нуждаюсь в некоторой помощи в выяснении простейшего способа отправки байтового массива через UDP из Java-программы в C++. Раньше я создал очень простую клиентскую и серверную программу, как в Java, так и смог использовать классы Java DatagramSocket и DatagramPacket для отправки и получения пакетов данных между двумя программами java client/server.

Но теперь у меня есть сетевой эмулятор, который мне нужно пройти, что написано в C++, поэтому я боюсь, что он не будет распознавать данные DatagramSocket и DatagramPacket, поскольку они являются Java-классами.

Если у меня есть имя хоста и прослушивание UDP-порта сетевого эмулятора, написанного в C++, как мне поступить с отправкой байтового массива в Java?

Теги:
sockets
network-programming

1 ответ

2
Лучший ответ

Ваш страх перед классами Java, которые не распознаются, ошибочен, потому что, когда вы пишете UDP-пакеты, вы говорите о другом API (UDP - это сетевой протокол). Вы не сериализуете объекты Java.

Ниже приведен рабочий пример: клиент Java отправляет UDP-пакеты на сервер PureData (то есть не-Java) (от кодирования):

package codesounding;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
  Every instruction type triggers an UDP message, each on different ports:
            Variable declaration:   7001
            Start block ({):        7002
            End block (}):          7003
            break:                  7004
            continue:               7005
            do:                     7006
            for:                    7007
            if:                     7008
            return:                 7009
            throw:                  7010
            while:                  7011
 */
public class UDPProcessor extends SilentProcessor {
    private static final String TARGET = "target"; //target host name
    private final DatagramPacket packetVar;
    private final DatagramPacket packetStart;
    private final DatagramPacket packetEnd;
    private final DatagramPacket packetBreak;
    private final DatagramPacket packetContinue;
    private final DatagramPacket packetDo;
    private final DatagramPacket packetFor;
    private final DatagramPacket packetIf;
    private final DatagramPacket packetReturn;
    private final DatagramPacket packetThrow;
    private final DatagramPacket packetWhile;
    final DatagramSocket socket; 
    final byte[] signal = "1;\n".getBytes(); //this message will trigger both PureData and MaxMSP UDP receivers; see the example patches

    public UDPProcessor() {
        try {
            String target = "127.0.0.1";
            if (System.getProperty(TARGET) != null  && !System.getProperty(TARGET).equals("")) {
                target = System.getProperty(TARGET);
            }
            System.out.println("Sending to "+target+"...");
            socket = new DatagramSocket();
            InetAddress address = InetAddress.getByName(target);

            packetVar = new DatagramPacket(signal, signal.length, address, 7001);
            packetStart = new DatagramPacket(signal, signal.length, address, 7002);
            packetEnd = new DatagramPacket(signal, signal.length, address, 7003);
            packetBreak = new DatagramPacket(signal, signal.length, address, 7004);
            packetContinue = new DatagramPacket(signal, signal.length, address, 7005);
            packetDo = new DatagramPacket(signal, signal.length, address, 7006);
            packetFor = new DatagramPacket(signal, signal.length, address, 7007);
            packetIf = new DatagramPacket(signal, signal.length, address, 7008);
            packetReturn = new DatagramPacket(signal, signal.length, address, 7009);
            packetThrow = new DatagramPacket(signal, signal.length, address, 7010);
            packetWhile = new DatagramPacket(signal, signal.length, address, 7011);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private synchronized void send(DatagramPacket packet) {
        try {
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
            //skipping 
        }
    }

    public void getVarDeclaration() {
        send(packetVar);
    }

    public void getStartBlock() {
        send(packetStart);
    }

    public void getEndBlock() {
        send(packetEnd);
    }

    public void getIfStatement() {
        send(packetIf);
    }

    public void getForStatement() {
        send(packetFor);
    }

    public void getDoStatement() {
        send(packetDo);
    }

    public void getWhileStatement() {
        send(packetWhile);
    }

    public void getReturnStatement() {
        send(packetReturn);
    }

    public void getBreakStatement() {
        send(packetBreak);
    }

    public void getContinueStatement() {
        send(packetContinue);
    }

    public void getThrowStatement() {
        send(packetThrow);
    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню