C # 클라이언트와 Java 서버 간의 Thrift 통신

최근에는 프로젝트에서 선생님을 돕기 위해 C #을 클라이언트로 사용하여 대용량 데이터를 Java 서버로 전송해야합니다. 이전 코드는 Native Socket으로 작성되었습니다 .Java 측은 매우 중복되고 복잡하며 유지 관리가 어렵 기 때문에 rpc 프레임 워크를 사용할 생각이었습니다. 실현은 후속 확장 및 유지 보수에 편리합니다.

중고품 프레임 워크가 완전한 직렬화 및 전송을 제공한다는 정보를 확인합니다. (Protobuf + grpc도 효율성을 고려하여 사용할 수 있으며 문서가 더 풍부합니다)

rpc의 프레임 워크 비교는 https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html을 참조하십시오.

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

중고품의 틀에 대한 문서가 너무 적고, 틀 5555를 사용하는 것은 정말 너무 어렵습니다 ... 인터넷상의 정보는 고르지 않지만 오랜 시간이 지나면 계산할 수 있으므로 전체 과정을 기록하고 살펴보십시오. 구덩이.

Windows 쪽에서 로컬로 C #과 Java를 모두 테스트했습니다. 먼저 thrift를 설치합니다.

각 버전에 대한 링크는 다음과 같습니다. http://archive.apache.org/dist/thrift/

dll

여기에서 다운로드 버전 은   thrift-0.10.0.tar.gz 이고 환경은 VS2019 및 .NET 4.5이며 프로젝트를 엽니 다. thrift-0.10.0 \ lib \ csharp \ src \ Thrift.sln, 재생성, 컴파일하면 다음 작업을 수행 할 수 있습니다. 나중에 코드를 작성할 때 참조해야하는 Thrift.dll (위치는 thrift-0.10.0 \ lib \ csharp \ src \ bin \ Debug \ Thrift.dll)을 생성합니다.

dat.drift

새 dat.drift 파일을 만들고 IDL을 사용하여 인터페이스를 설명하고 .cs 및 .java 코드를 생성합니다. 이 단계는 Linux 시스템 환경을 사용해야합니다 (그렇지 않은 경우 가상 머신을 사용하여 Linux 환경을 설치하는 것이 좋습니다). 온라인 방식으로 Win10 환경에서 해당 코드 파일을 생성 할 수 없기 때문입니다.

IDL 설명 언어는 다음을 참조 할 수 있습니다 : 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

예는 다음과 같습니다.

구조 및 서비스 방법 정의

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

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

여기서 단방향은 메서드 호출이 값을 반환 할 필요가 없음을 의미하므로 호출의 효율성은 향상되지만 안정성은 보장 할 수 없습니다.

Linux 환경에서 thrift를 설치하려면 다음을 참조하십시오. https://blog.csdn.net/huangbaokang/article/details/80065606

설치가 성공하면 thrift를 사용하여 .cs 파일을 생성하고 Linux 명령 줄에서 실행합니다.

thrift -r --gen csharp dat.thrift

gen-csharp 디렉터리는 인코딩 중에 C # 프로젝트 디렉터리에 복사해야하는 .cs 파일 인 현재 디렉터리에 생성됩니다.

Linux 명령 줄에서 실행

thrift -r --gen java dat.thrift

gen-java 디렉토리는 인코딩하는 동안 Java 프로젝트 디렉토리로 복사해야하는 .java 파일을 포함하는 현재 디렉토리에 생성됩니다.

클라이언트 코드

C #으로 새 프로젝트를 생성하고 앞서 생성 한 Thrift.dll을 임포트 한 후 앞서 생성 한 .cs 파일을 프로젝트에 복사하면 메인 프로그램의 샘플 코드는 다음과 같다.

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();
                }
            }

        }
    }
}

서버 코드

Java 새 Maven 프로젝트, 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>

정의한 서비스 인터페이스를 상속하고 인터페이스에서 메서드를 구현합니다. 여기서 콘텐츠를 인쇄합니다.

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);
    }
}

서버 메인 프로그램.

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();
    }
}

 

추천

출처blog.csdn.net/qinian_ztc/article/details/109432787