【问题标题】:JAVA server and .Net client programmingJAVA 服务器和 .Net 客户端编程
【发布时间】:2021-05-02 10:34:59
【问题描述】:

我正在与 Java 服务器进行通信。 一个用java开发的应用程序,它在某个ip、port上运行。 例如192.168.1.1 端口 9090 没有人想使用我的 ASp .NET (C#) 与该服务器通信

我有以下场景:

  1. 与服务器的连接
  2. 一旦数据传输完毕,我必须通知服务器我的数据传输完成。所以之后服务器将处理数据并回复我(响应)。
  3. 然后我必须读取该数据。

当我使用 NetworkStream 类时。

我有 1 种方法,我正在使用写入发送数据。

但是服务器不明白是否接收到完整的数据。 所以它一直在等待数据。

那该怎么做呢?

【问题讨论】:

  • 如果你不给我们一些代码来看看你是如何构建你的客户端和服务器的,那真的不可能帮助你。

标签: java .net sockets network-programming tcpclient


【解决方案1】:

也许您可以考虑使用 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 ....
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2011-07-01
    • 2014-10-19
    相关资源
    最近更新 更多