Node.js 스트림 스트림이 문자열 인코딩 문제를 해결하는 방법

지난 며칠 동안 LibP2P를 클래스 라이브러리로 사용하여 P2P를 개발하고 피어 간의 통신 프로세스에서 몇 가지 문제가 발생했습니다.한 피어에서 다른 피어로 전송되는 json 문자열은 완전히 JSON.parse가 될 수 없습니다.

한참을 고민하다 보니 대류 개념이 잘 학습되지 않았다는 사실이 밝혀졌습니다.LipP2P 통신은 스트리밍 방식을 사용하여 상호작용을 하기 때문에 입력 문자열이 손상될 수 있습니다. 특히 중국어, 특히 중국어! 영어 전송을 처음 테스트했을 때 "Hello"라는 단어를 입력하고 JSON.parse의 "예기치 않은 토큰 오류"가 나타날 때까지 아무런 문제가 없었다는 점을 강조해야 합니다.

해결책은 매우 간단합니다. 즉, 인코딩을 사용하여 이 문자열을 인코딩하는 것입니다(일반 문자열이든 json 형식이든 상관 없음). 인코딩에는 많은 유형이 있으며 노드의 Buffer 개체는 다음과 같은 인코딩을 제공합니다:
버퍼 인코딩 방법
사실 아무거나 선택해야 하지만 base64를 선택할 수 있습니다.결국 base는 웹에서 더 일반적인 인코딩 방법입니다.I 남들이 안해봤어 테스트해봐 다들 직접 테스트해봐

base64를 선택한 후 통신을 위한 두 피어의 스트림의 인코딩 및 디코딩이며 하나는 다이얼 끝(송신)이고 다른 하나는 핸들 끝(수신 끝)입니다.코드는 다음과 같습니다.

수신 종료:

function handle(action: string, callback: MessageCallback): void {
    
    
    this.node.handle(action, async ({
    
     stream }) => {
    
    
        const msg = await pipe(stream, concat)
        const str = Buffer.from(msg.toString(), 'base64').toString('utf8')
        callback($.msgParse(str))
    })
}

보내는 사람:

async function send(action: string, msg: Message, peer: Peer[] = []): Promise<void> {
    
    
    if (!peer.length) peer = await this.getPeer()
    // send my peer to the p2p network(every one)
    for (const item of peer) {
    
    
        // skip myself
        if (this.isMyPeer(item.address)) continue
        this.node
            .dialProtocol(`${
      
      item.address}/p2p/${
      
      item.id}`, action)
            .then(({
    
     stream }) => pipe(Buffer.from($.msgStringify(msg)).toString('base64'), stream))
            .catch(e => {
    
    
                console.log(e)
                console.log('Disconnect', item.address)
                this.killPeer(item)
            })
    }
}

실제로 Java 및 C++의 스트림에도 이 문자 유형 문제가 있습니다. 여기서는 소개하지 않겠습니다.. 요약하면 스트림을 사용할 때 인코딩 및 디코딩 작업을 수행하는 것이 가장 좋으며 특히 일부 이모티콘 표현도 포함하는 유니 코드 기반 인코딩이 가장 좋습니다.

Supongo que te gusta

Origin blog.csdn.net/u014466109/article/details/115393238
Recomendado
Clasificación