Proses mengirim dan menerima pesan berbeda antara standar TCP dan WebSocket. Di bawah ini, kami menjelaskan proses ini secara detail untuk kedua jenis koneksi.
Untuk mengirim pesan melalui koneksi TCP, lakukan hal berikut:
Ubah pesan Protobuf menjadi array byte (menggunakan pengkodean Protobuf) dengan menggunakan SDK Google Protocol Buffer resmi untuk bahasa pemrograman pilihan Anda.
Dapatkan panjang array yang dibuat selama langkah 1. Buat array byte baru dari integer ini. Balikkan array byte baru.
Gabungkan array byte baru dan array byte yang berisi pesan Protobuf asli.
Kirim array yang digabungkan ke aliran koneksi.
Contoh di bawah ini menunjukkan bagaimana langkah-langkah ini dilakukan dalam SDK Open API resmi.
client=Client(EndPoints.PROTOBUF_LIVE_HOSTifhostType.lower()=="live"elseEndPoints.PROTOBUF_DEMO_HOST,EndPoints.PROTOBUF_PORT,TcpProtocol)request=ProtoOAApplicationAuthReq()# Can be any messagedeferred=client.send(request)
Python example
Menggunakan Twisted, contoh Python melakukan hampir semua operasi yang sama dengan contoh C#. client.send(request) dapat dijelaskan sebagai berikut.
123
request=ProtoOAApplicationAuthReq()# Can be any messagerequestAsString=request.SerializeToString()# This method is a part of the Google Protobuf SDKrequestAsInt32String=struct.pack("!H",len(requestAsString))# The message is concatenated with the reversed array
Untuk mengirim pesan, SDK Python menggunakan metode Protocol.transport.write().
Semua SDK Open API mengandalkan eksekusi asinkron, artinya mereka tidak menunggu pesan tiba tetapi bereaksi terhadap pesan yang tiba secara dinamis. Sebagai hasilnya, menerima pesan biasanya dilakukan melalui penangan acara.
Untuk membaca pesan, Anda harus melakukan serangkaian tindakan yang membalikkan langkah-langkah yang diperlukan untuk mengirim pesan.
Terima empat byte pertama dari array byte (ingat, mereka menunjukkan panjang pesan). Balikkan empat byte ini dan ubah menjadi integer.
Baca X jumlah byte dari aliran di mana X adalah integer yang Anda dapatkan pada langkah 1.
Gunakan SDK Google Protobuf untuk mendeserialisasi pesan menjadi ProtoMessage yang valid.
Gunakan bidang payloadType dari objek ProtoMessage untuk menemukan jenis aktualnya. Melalui SDK Google Protobuf, ubah ProtoMessage menjadi objek dari jenis ProtoOA... yang dibutuhkan.
Cuplikan kode di bawah ini menunjukkan bagaimana SDK Open API resmi mendekati pembacaan pesan.
_tcpClient=newTcpClient{LingerState=newLingerOption(enable:true,10)};await_tcpClient.ConnectAsync(Host,Port).ConfigureAwait(continueOnCapturedContext:false);SslStream_sslStream=newSslStream(_tcpClient.GetStream(),leaveInnerStreamOpen:false);await_sslStream.AuthenticateAsClientAsync(Host).ConfigureAwait(continueOnCapturedContext:false);privateasyncvoidReadTcp(CancellationTokencancellationToken){byte[]dataLength=newbyte[4];byte[]data=null;try{while(!IsDisposed){intnum=0;do{intcount=dataLength.Length-num;intnum2=num;num=num2+await_sslStream.ReadAsync(dataLength,num,count,cancellationToken).ConfigureAwait(continueOnCapturedContext:false);if(num==0){thrownewInvalidOperationException("Remote host closed the connection");}}while(num<dataLength.Length);intlength=GetLength(dataLength);if(length<=0){continue;}data=ArrayPool<byte>.Shared.Rent(length);num=0;do{intcount2=length-num;intnum2=num;num=num2+await_sslStream.ReadAsync(data,num,count2,cancellationToken).ConfigureAwait(continueOnCapturedContext:false);if(num==0){thrownewInvalidOperationException("Remote host closed the connection");}}while(num<length);ProtoMessageprotoMessage=ProtoMessage.Parser.ParseFrom(data,0,length);ArrayPool<byte>.Shared.Return(data);OnNext(protoMessage);}}catch(ExceptioninnerException){if(data!=null){ArrayPool<byte>.Shared.Return(data);}ReceiveExceptionexception=newReceiveException(innerException);OnError(exception);}}privateintGetLength(byte[]lengthBytes){Span<byte>span=lengthBytes.AsSpan();span.Reverse();returnBitConverter.ToInt32(span);}
Contoh Python
Dalam contoh Python, semua operasi dengan byte saat menerima pesan ditangani oleh metode dataReceived() seperti yang ditunjukkan di bawah ini.
1 2 3 4 5 6 7 8 910111213141516
defdataReceived(self,recd):""" Convert int prefixed strings into calls to stringReceived. """self.recvd=self.recvd+recdwhilelen(self.recvd)>=self.prefixLengthandnotself.paused:length,=struct.unpack(self.structFormat,self.recvd[:self.prefixLength])iflength>self.MAX_LENGTH:self.lengthLimitExceeded(length)returniflen(self.recvd)<length+self.prefixLength:breakpacket=self.recvd[self.prefixLength:length+self.prefixLength]self.recvd=self.recvd[length+self.prefixLength:]self.stringReceived(packet)
Untuk mengirim pesan melalui koneksi WebSocket, lakukan tindakan berikut:
Serialisasi pesan ke dalam format data yang sesuai (misalnya, string).
Tambahkan pesan yang telah diserialisasi ke antrian kirim Anda.
Contoh di bawah ini menunjukkan bagaimana tindakan ini dilakukan dalam SDK Open API resmi.
SDK C# menggunakan kelas WebsocketClient yang merupakan bagian dari paket Websocket.Client. Seperti yang ditunjukkan di bawah ini, metode WebsocketClient.Send() bekerja sebagai berikut.
Sebelum berlangganan, SDK .NET mem-parsing pesan menjadi pesan Protobuf. Langganan yang diperlukan ditambahkan dalam tubuh callback ConnectWebSocket().