Repository navigation
motor xsocket
Home > Motor XSocket 🚧
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Vale para a 2.0 · só Delphi 11 ou mais novo, Windows e Linux · Nível: intermediário
Em uma frase: servidor e cliente HTTP/1.1 assíncronos sobre a biblioteca Delphi-Cross-Socket (IOCP no Windows, epoll no Linux), com HTTPS pelo OpenSSL dela.
Você vai precisar: o pacote XSocketRAL, o código-fonte da Delphi-Cross-Socket no caminho de
bibliotecas do Delphi (as pastas Net, Utils e DelphiToFPC) e, para HTTPS, o OpenSSL 3.
Note
A biblioteca não compila no Delphi 10.4 nem em versões abaixo do 11, e não existe para o Lazarus. Use uma cópia limpa dela: edições soltas na sua cópia de trabalho quebram a compilação.
uses RALXSocketServer;
Servidor := TRALXSocketServer.Create(Self);
Servidor.Port := 8080;
Servidor.CreateRoute('ping', Tratador.Ping);
Servidor.Active := True;HTTPS, com o certificado em arquivos PEM (ou em texto PEM, em CertPEM e KeyPEM):
Servidor.SSL.CertFile := 'cert.pem';
Servidor.SSL.KeyFile := 'key.pem'; // sem senha: a biblioteca não aceita chave protegida
Servidor.SSL.Enabled := True;| propriedade | padrão | |
|---|---|---|
IoThreads |
0 | threads de entrada e saída da biblioteca; 0 = duas por processador, mais uma |
ExecuteInIOThread |
falso | executa o pedido na própria thread de E/S, sem passar a um trabalhador |
PoolCount |
0 | threads trabalhadoras que executam os pedidos; 0 = quatro por processador; sem efeito com ExecuteInIOThread
|
SSL |
desligado |
CertFile/KeyFile ou CertPEM/KeyPEM; sem senha de chave |
ExecuteInIOThread é um pouco mais rápido para tratadores curtos, mas um tratador que bloqueia
(banco, chamada a outro servidor) ou que faz fluxo segura a thread de E/S, e toda conexão
dela espera. Deixe falso se há rotas lentas.
O motor também entrega resposta em fluxo ao vivo (em pedaços, com
Transfer-Encoding: chunked).
uses RALXSocketClient;
Cliente.EngineType := 'XSocket';
Cliente.BaseURL.Text := 'http://servidor:8080';- Mantém a conexão aberta entre as chamadas (keep-alive).
- Descomprime sozinho corpo
gzip/deflate; formulários, cookies, cabeçalhos eRequestTimeoutfuncionam como nos outros motores. -
Não confere o certificado do servidor e não tem pin: com
SSL.Verify := svAlwaysa chamada é recusada (rteCertificate), em vez de aceitar sem conferir. ComsvNeverconecta. - Não segue redirecionamentos.
- Não entrega a resposta em fluxo: o corpo chega inteiro e os eventos de fluxo recebem tudo no fim.
-
HEADfecha a conexão depois da resposta. - Uma resposta com status
>= 400também fecha a conexão. - Respostas ao vivo (fluxo) simultâneas: no máximo
IoThreads - 1; as demais são respondidas inteiras. - Só HTTP/1.1: sem HTTP/2 e sem
Upgrade.
| Você quer | Use |
|---|---|
| muitas conexões abertas no Delphi 11+, sem uma thread por conexão | este motor |
| servidor assíncrono sem depender do mORMot2 | este motor |
| máxima vazão de pedidos curtos | o mORMot2 com smAsync rende bem mais (Qual motor escolher?) |
| cliente que confere o certificado ou segue redirecionamento | outro motor (Indy, netHTTP, mORMot2) |
| Delphi 10.4 ou anterior, ou Lazarus | outro motor |
| O que acontece | Causa | O que fazer |
|---|---|---|
não compila (Net.CrossSocket.Base não encontrada) |
a biblioteca não está no caminho do Delphi | adicione as pastas Net, Utils e DelphiToFPC
|
| não compila no 10.4 | a biblioteca pede o Delphi 11 | use outro motor |
| HTTPS não sobe | falta o OpenSSL 3, ou CertFile/KeyFile errados, ou chave com senha |
confira as DLLs/.so, os caminhos e gere a chave sem senha |
cliente recusa o certificado com svAlways
|
o motor não confere certificado | use svNever em teste, ou outro motor |
tudo trava com ExecuteInIOThread
|
tratador lento segura a thread de E/S | desligue a opção |
- Qual motor escolher?, Resposta em fluxo.
- Exemplo:
Delphi/Console/XSocketExampleno repositório PascalRAL-Samples.
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar