AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76920783
Accepted
Tommimon
Tommimon
Asked: 2023-08-17 18:47:49 +0800 CST2023-08-17 18:47:49 +0800 CST 2023-08-17 18:47:49 +0800 CST

Os soquetes Java são FIFO?

  • 772

Mensagens diferentes enviadas no mesmo soquete são sempre recebidas na ordem FIFO do outro lado?

Não consigo encontrar essa informação em lugar nenhum, sei que o TCP reordena os pacotes, mas também conta para mensagens separadas na mesma conexão?

Se não, o que é uma classe Java para comunicação de rede que preserva a ordem FIFO entre dois pares?

Editar:

Como um comentário apontou, não há mensagens nos soquetes. O que eu estava me referindo é o uso de:

ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream());
writer.writeObject(obj1);
writer.writeObject(obj2);

Esses objetos são concedidos para serem recebidos na mesma ordem?

java
  • 2 2 respostas
  • 94 Views

2 respostas

  • Voted
  1. Best Answer
    Stephen C
    2023-08-17T19:07:18+08:002023-08-17T19:07:18+08:00

    Mensagens diferentes enviadas no mesmo soquete são sempre recebidas na ordem FIFO do outro lado?

    Os soquetes não são fluxos de mensagens. A abstração não suporta esse conceito. Da mesma forma, o TCP é um protocolo para enviar uma sequência de bytes.

    Um Socket entrega um fluxo de bytes ao destinatário na mesma ordem em que o remetente os enviou. A implementação do protocolo TCP garante 1 que os dados não sejam reordenados. O fato de que os pacotes de rede reais podem ser descartados, retransmitidos e/ou recebidos fora de sequência é tratado pelas pilhas de protocolos.

    (Você pode projetar e implementar um protocolo de aplicativo baseado em mensagem que usa o TCP como seu protocolo de transporte. Por exemplo, designe valores de byte específicos para significar o início e o fim de uma mensagem. As mensagens no nível do aplicativo não serão reordenadas pelo TCP, pois o fluxo de bytes que os representa não é reordenado.)

    1 - Devo qualificar isso. TCP / IPv4 usa uma soma de verificação (um CRC de 16 bits) em cada pacote de rede para proteger contra erros de transmissão. No entanto, é teoricamente possível que o pacote seja corrompido de forma que dois bytes sejam transpostos e o CRC ainda seja válido. A "garantia" ignora isso.


    O que eu estava me referindo é o uso de:

    ObjectOutputStream writer = 
            new ObjectOutputStream(socket.getOutputStream());
    writer.writeObject(obj1);
    writer.writeObject(obj2);
    

    Já explicamos que os sockets preservam a ordem dos bytes. Portanto, se qualquer reordenação ocorrer no código acima e no código de recebimento correspondente, isso será resultado de algo nas APIs ObjectOutputStreame .ObjectInputStream

    Não encontrei nada nos javadocs ou na especificação de serialização de objetos Java que declare explicitamente que os objetos são gravados e lidos na mesma ordem. No entanto, é assim que o protocolo e as APIs são projetados para funcionar e como a implementação realmente se comporta.

    Esses objetos têm garantia de recebimento no mesmo pedido?

    Sim.

    Você pode verificar isso examinando o código-fonte das respectivas classes na base de código OpenJDK. (Qualquer versão.)

    • 5
  2. skzmachinery
    2023-08-17T18:52:24+08:002023-08-17T18:52:24+08:00

    Não, mensagens diferentes enviadas no mesmo soquete não têm garantia de recebimento na ordem FIFO (primeiro a entrar, primeiro a sair) da outra extremidade. Os soquetes operam na camada de transporte da pilha de rede e estão sujeitos às características da rede subjacente, que podem introduzir variabilidade nos tempos e na ordem de entrega das mensagens devido a fatores como congestionamento da rede, alterações de roteamento e variação dos caminhos dos pacotes. Embora o TCP (Protocolo de Controle de Transmissão) forneça entrega confiável e ordenada de dados, ele não garante que mensagens de soquetes diferentes cheguem na mesma ordem em que foram enviadas. Os aplicativos que dependem da ordem das mensagens podem precisar implementar seus próprios mecanismos de sincronização ou contar com protocolos que ofereçam garantias de ordem mais fortes, se necessário.

    • -5

relate perguntas

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve