최근에는 프로젝트에서 선생님을 돕기 위해 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();
}
}