Программирование JAVA-сервера и .Net-клиента - PullRequest
0 голосов
/ 29 февраля 2012

Я делаю связь с сервером Java.Одно приложение, которое разработано в Java и работает на каком-то IP-порту.например, 192.168.1.1 порт 9090 Нет, я не хочу общаться с этим сервером, используя мой ASp .NET (C #)

У меня есть следующий сценарий:

  1. соединение с сервером
  2. после передачи данных я должен сообщить серверу, что передача данных завершена. Итак, после этого сервер обработает данные и вернет меня (ответ).
  3. Затем мне нужно будет прочитать эти данные.

Когда я использую класс NetworkStream.

У меня есть 1 метод, который я использую, это запись для отправки данных.

Но сервер не понимает, были ли получены полные данные или нет.Так что постоянно жду данных.

Так как это сделать?

1 Ответ

1 голос
/ 06 марта 2012

Возможно, вы могли бы подумать об использовании Eneter Messaging Framework для этого общения.Это легкая кроссплатформенная платформа для межпроцессного взаимодействия.Код службы Java будет выглядеть примерно так:

// Declare your type of request message.
public static class MyRequestMsg
{
    public double Number1;
    public double Number2;
}

// Declare your type of response message.
public static class MyResponseMsg
{
    public double Result;
}


public static void main(String[] args) throws Exception
{
    // Create receiver that receives MyRequestMsg and
    // responses MyResponseMsg
    IDuplexTypedMessagesFactory aReceiverFactory = new DuplexTypedMessagesFactory();
    myReceiver = 
      aReceiverFactory.createDuplexTypedMessageReceiver(MyResponseMsg.class, MyRequestMsg.class);

    // Subscribe to handle incoming messages.
    myReceiver.messageReceived().subscribe(myOnMessageReceived);

    // Create input channel listening to TCP.
    IMessagingSystemFactory aMessaging = new TcpMessagingSystemFactory();
    IDuplexInputChannel anInputChannel = 
      aMessaging.createDuplexInputChannel("tcp://127.0.0.1:4502/");

    // Attach the input channel to the receiver and start the listening.
    myReceiver.attachDuplexInputChannel(anInputChannel);

    System.out.println("Java service is running. Press ENTER to stop.");
    new BufferedReader(new InputStreamReader(System.in)).readLine();

    // Detach the duplex input channel and stop the listening.
    // Note: it releases the thread listening to messages.
    myReceiver.detachDuplexInputChannel();
}

private static void onMessageReceived(Object sender, 
             TypedRequestReceivedEventArgs<MyRequestMsg> e)
{
    // Get the request message.
    MyRequest aRequest = e.getRequestMessage();

    ... process the request ...

    // Response back the result.
    MyResponseMsg aResponseMsg = new MyResponseMsg();
    ... set the result in the response message ...

    try
    {
        // Send the response message.
        myReceiver.sendResponseMessage(e.getResponseReceiverId(), aResponseMsg);
    }
    catch (Exception err)
    {
        EneterTrace.error("Sending the response message failed.", err);
    }
}


// Handler used to subscribe for incoming messages.
private static EventHandler<TypedRequestReceivedEventArgs<MyRequestMsg>> myOnMessageReceived
        = new EventHandler<TypedRequestReceivedEventArgs<MyRequestMsg>>()
{
    @Override
    public void onEvent(Object sender, TypedRequestReceivedEventArgs<MyRequestMsg> e)
    {
        onMessageReceived(sender, e);
    }
};

И клиент .NET будет выглядеть примерно так:

            public class MyRequestMsg
    {
        public double Number1 { get; set; }
        public double Number2  { get; set; }
    }

    public class MyResponseMsg
    {
        public double Result { get; set; }
    }


    private IDuplexTypedMessageSender<MyResponseMsg, MyRequestMsg> myMessageSender;


    private void OpenConnection()
    {
        // Create message sender.
        // It sends string and as a response receives also string.
        IDuplexTypedMessagesFactory aTypedMessagesFactory = new DuplexTypedMessagesFactory();
        myMessageSender =
           aTypedMessagesFactory.CreateDuplexTypedMessageSender<MyResponseMsg, MyRequestMsg>();

        // Subscribe to receive response messages.
        myMessageSender.ResponseReceived += OnResponseReceived;

        // Create TCP messaging.
        IMessagingSystemFactory aMessaging = new TcpMessagingSystemFactory();
        IDuplexOutputChannel anOutputChannel =
           aMessaging.CreateDuplexOutputChannel("tcp://127.0.0.1:4502/");

        // Attach the output channel to the message sender and be able
        // send messages and receive responses.
        myMessageSender.AttachDuplexOutputChannel(anOutputChannel);
    }

    private void CloseConnection(object sender, FormClosedEventArgs e)
    {
        // Detach output channel and stop listening to response messages.
        myMessageSender.DetachDuplexOutputChannel();
    }

    private void SendMessage()
    {
        // Create message.
        MyRequestMsg aRequestMessage = new MyRequestMsg();
        ...

        // Send message.
        myMessageSender.SendRequestMessage(aRequestMessage);
    }

    private void OnResponseReceived(object sender,
                              TypedResponseReceivedEventArgs<MyResponseMsg> e)
    {
        // Get the response message.
        MyResponseMsg aResponse = e.ResponseMessage;

        .... process the response from your Java client ....
    }

Более подробную техническую информацию вы можете найти здесь .Онлайн-справка по Java здесь , а онлайн-справка по .NET здесь .

...