Comunicación de ahorro entre el cliente C # y el servidor Java

Recientemente, para ayudar al profesor en un proyecto, necesito usar C # como cliente para transmitir una gran cantidad de datos al servidor Java. El código anterior estaba escrito en Socket nativo. El lado de Java es muy redundante y complejo y difícil de mantener. Por lo tanto, pensé en usar el marco rpc. La realización es conveniente para la expansión y el mantenimiento posteriores.

Al verificar la información, se encontró que el marco de ahorro proporciona una serialización y transmisión completas. (Protobuf + grpc también se puede utilizar en consideración a la eficiencia, y la documentación es más abundante)

Para la comparación del marco de trabajo de rpc, consulte: https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html

https://blog.csdn.net/z69183787/article/details/52605653

Hay muy pocos documentos para el marco de ahorro. Es realmente muy difícil usar el marco. 5555 ... La información en Internet es desigual, pero después de mucho tiempo, se puede calcular. Así que registre todo el proceso y el pasado. El hoyo.

Probé tanto C # como Java localmente en el lado de Windows. Primero instale el ahorro.

Los enlaces para cada versión son los siguientes: http://archive.apache.org/dist/thrift/

dll

La  versión que descargué aquí es   thrift-0.10.0.tar.gz , el entorno es VS2019 y .NET 4.5, abre el proyecto: thrift-0.10.0 \ lib \ csharp \ src \ Thrift.sln, regenera, compila y puedes Genere Thrift.dll (la ubicación es thrift-0.10.0 \ lib \ csharp \ src \ bin \ Debug \ Thrift.dll), al que se debe hacer referencia al escribir código más adelante.

dat.drift

Cree un nuevo archivo dat.drift, use IDL para describir la interfaz y genere código .cs y .java. Este paso necesita usar el entorno del sistema Linux (si no, se recomienda usar una máquina virtual para instalar el entorno Linux), porque no puedo generar el archivo de código correspondiente en el entorno Win10 de acuerdo con el método en línea.

El lenguaje de descripción IDL puede referirse a: https://diwakergupta.github.io/thrift-missing-guide/#_types

https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/tutorial.thrift

Los ejemplos son los siguientes:

Definición de una estructura y un método de servicio.

struct Dat{
	1: bool isColDat
	2: list<byte> data
}

service SendDatService{
	oneway void send(1:Dat dat)
}

El oneway aquí significa que la llamada al método no necesita devolver un valor, lo que mejora la eficiencia de la llamada, pero no se puede garantizar la confiabilidad.

Instale thrift en el entorno de Linux, consulte: https://blog.csdn.net/huangbaokang/article/details/80065606

Después de que la instalación sea exitosa, use thrift para generar el archivo .cs y ejecutarlo en la línea de comandos de Linux

thrift -r --gen csharp dat.thrift

El directorio gen-csharp se generará en el directorio actual, que es un archivo .cs, que debe copiarse en el directorio del proyecto C # durante la codificación.

Ejecutar en la línea de comandos de Linux

thrift -r --gen java dat.thrift

El directorio gen-java se generará en el directorio actual, que contiene archivos .java, que deben copiarse en el directorio del proyecto Java durante la codificación.

Codigo del cliente

Cree un nuevo proyecto en C #, importe el Thrift.dll generado anteriormente y copie el archivo .cs generado anteriormente en el proyecto. El código de muestra del programa principal es el siguiente.

using System;
using System.Collections.Generic;
using Thrift.Protocol;
using Thrift.Transport;

namespace IBAClientLT
{
    static class Program
    {
        public const string SERVERIP = "localhost";
        public static int SERVERPORT = 9000;
        public static int TIMEOUT = 5000;

        [STAThread]
        static void Main()
        {
            TTransport transport = null;
            try
            {
                //transport = new TSocket(SERVERIP, SERVERPORT, TIMEOUT);
                transport = new TFramedTransport(new TSocket(SERVERIP, SERVERPORT, TIMEOUT));
                //协议要和服务端一致
                TProtocol protocol = new TCompactProtocol(transport);
                SendDatService.Client client = new SendDatService.Client(protocol);
                transport.Open();
                
                Dat d = new Dat();
                d.IsColDat = false;
                List<sbyte> bt = new List<sbyte>();
                bt.Add(1);
                bt.Add(2);
                bt.Add(3);
                d.Data = bt;
                client.send(d);//远程调用
                client.Dispose();
                Console.ReadKey();//保持命令行窗口不关闭
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }
            finally
            {
                if (null != transport)
                {
                    //close
                    transport.Close();
                }
            }

        }
    }
}

Código del servidor

Java nuevo proyecto Maven, agregue dependencia al archivo pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
         <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.10.0</version>
            <!--<type>pom</type>-->
        </dependency>

Heredamos la interfaz de servicio que definimos, e implementamos los métodos en la interfaz, aquí imprimimos el contenido.

package thrift;

import org.apache.thrift.TException;

public class SendDatServiceImpl implements SendDatService.Iface {
    @Override
    public void send(Dat dat) throws TException {
        System.out.println("iscolDat: "+dat.isColDat);
        System.out.println("data: "+dat.data);
    }
}

Programa principal del servidor.

package thrift;

import org.apache.thrift.TNonblockingMultiFetchClient;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

public class ThriftServer {
    public static void main(String[] args) throws TTransportException {
        TNonblockingServerSocket socket =new TNonblockingServerSocket(9000);
        THsHaServer.Args arg  =new THsHaServer.Args(socket).minWorkerThreads(1).maxWorkerThreads(4);
        SendDatService.Processor<SendDatServiceImpl> processor=
                new SendDatService.Processor<SendDatServiceImpl>(new SendDatServiceImpl());

        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processor));

        TServer server =new THsHaServer(arg);
        System.out.println("server start");
        server.serve();
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/qinian_ztc/article/details/109432787
Recomendado
Clasificación