温馨提示×

java调用c#如何处理回调

小樊
81
2024-12-01 15:30:21
栏目: 编程语言

在Java中调用C#代码并处理回调,可以通过以下几种方式实现:

  1. 使用Java Native Interface (JNI): 通过JNI,你可以在Java代码中调用C#方法。首先,你需要在C#中创建一个Java Native Interface (JNI) 类,然后在Java代码中加载这个类并调用相应的方法。

    C# 示例:

    using System;
    using System.Runtime.InteropServices;
    
    public class JniWrapper
    {
        [DllImport("kernel32.dll")]
        public static extern void Java_com_example_myapp_MyClass_nativeCallback(string message);
    
        public static void CallNativeCallback(string message)
        {
            nativeCallback(message);
        }
    }
    

    Java 示例:

    public class MyClass {
        static {
            System.loadLibrary("jniwrapper");
        }
    
        public native void nativeCallback(String message);
    
        public static void main(String[] args) {
            MyClass myClass = new MyClass();
            myClass.nativeCallback("Hello from Java!");
        }
    }
    
  2. 使用Web API或REST服务: 如果你有一个C#后端服务,你可以创建一个Web API或REST服务,让Java客户端通过HTTP请求与C#后端进行通信。这种方法不需要在Java和C#之间直接调用,而是通过网络协议进行通信。

    C# 示例(ASP.NET Core):

    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    
    [ApiController]
    [Route("api/[controller]")]
    public class MyController : ControllerBase
    {
        [HttpPost]
        public async Task<IActionResult> HandleRequest([FromBody] string message)
        {
            // 处理请求并调用回调方法
            await Task.Delay(1000);
            Console.WriteLine("Received message: " + message);
            return Ok();
        }
    }
    

    Java 示例:

    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MyClient {
        public static void main(String[] args) {
            try {
                URL url = new URL("http://localhost:5000/api/my");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true);
                connection.setRequestProperty("Content-Type", "application/json; utf-8");
    
                String input = "{\"message\":\"Hello from Java!\"}";
                byte[] inputBytes = input.getBytes("utf-8");
    
                connection.setFixedLengthStreamingMode(inputBytes.length);
                try (OutputStream os = connection.getOutputStream()) {
                    os.write(inputBytes);
                }
    
                int responseCode = connection.getResponseCode();
                System.out.println("Response Code: " + responseCode);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  3. 使用gRPC: gRPC是一个高性能、开源的通用RPC框架,可以在Java和C#之间进行通信。首先,你需要定义一个.proto文件,然后使用gRPC工具生成Java和C#客户端和服务端代码。

    示例.proto文件:

    syntax = "proto3";
    
    package mygrpc;
    
    service MyService {
        rpc CallMyMethod (MyRequest) returns (MyResponse);
    }
    
    message MyRequest {
        string message = 1;
    }
    
    message MyResponse {
        string result = 1;
    }
    

    C# 示例(服务器端):

    using System;
    using System.Threading.Tasks;
    using Grpc.Core;
    
    public class MyService : MyService.MyServiceBase
    {
        public override Task<MyResponse> CallMyMethod(MyRequest request, ServerCallContext context)
        {
            // 处理请求并调用回调方法
            Console.WriteLine("Received message: " + request.Message);
            return Task.FromResult(new MyResponse { Result = "Hello from C#" });
        }
    }
    

    Java 示例(客户端):

    import io.grpc.ManagedChannel;
    import io.grpc.ManagedChannelBuilder;
    import mygrpc.MyServiceGrpc;
    import mygrpc.MyServiceOuterClass;
    
    public class MyClient {
        public static void main(String[] args) throws Exception {
            ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();
            MyServiceGrpc.MyServiceClient client = MyServiceGrpc.newClient(channel);
    
            MyServiceOuterClass.MyRequest request = MyServiceOuterClass.MyRequest.newBuilder().setMessage("Hello from Java!").build();
            MyServiceOuterClass.MyResponse response = client.callMyMethod(request);
            System.out.println("Response: " + response.getResult());
    
            channel.shutdown();
        }
    }
    

这些方法都可以实现Java调用C#并处理回调的功能,你可以根据具体需求选择合适的方式。

0