Reacte a API de soquete TCP nativo para Android, iOS e macOS com suporte SSL/TLS . Ele permite que você crie soquetes do cliente e servidor TCP, imitando as funcionalidades da API da NET do Node e do Node (verifique a API disponível para obter mais informações).
nettls substituídoInstale a biblioteca usando qualquer um dos fios:
yarn add react-native-tcp-socket
ou npm:
npm install --save react-native-tcp-socket
net Como react-native-tcp-socket oferece a mesma API que a rede do Node, caso você queira importar este módulo como net ou Use require('net') no seu JavaScript, você deve adicionar as seguintes linhas ao seu arquivo package.json .
{
"react-native" : {
"net" : " react-native-tcp-socket "
}
}Além disso, para obter os tipos de TS (ou conclusão automática) fornecidos por este módulo, você também deve adicionar o seguinte ao seu arquivo de declarações personalizadas.
...
declare module 'net' {
import TcpSockets from 'react-native-tcp-socket' ;
export = TcpSockets ;
} Se você deseja evitar tipos net duplicados, certifique -se de não usar a node_modules/@types em sua propriedade tsconfig.json "typeRoots" .
Verifique o aplicativo de exemplo fornecido para um exemplo de funcionamento.
tls substituído O mesmo se aplica ao módulo tls . No entanto, você deve estar ciente do seguinte:
Server exportada por padrão é não-TLS. Para usar o servidor TLS, você deve usar a classe TLSServer . Você pode substituir a classe Server padrão ( tls.Server = tls.TLSServer ). O mesmo acontece com o createServer() e connect() . Para usar os métodos TLS, você deve usar os métodos createTLSServer() e connectTLS() , respectivamente. Você pode substituir os métodos padrão ( tls.createServer = tls.createTLSServer e tls.connect = tls.connectTLS ).tls do Node exige que as chaves e os certificados sejam fornecidos como uma string. No entanto, o módulo react-native-tcp-socket exige que eles sejam importados com require() .Além disso, para obter os tipos de TS (ou conclusão automática) fornecidos por este módulo, você também deve adicionar o seguinte ao seu arquivo de declarações personalizadas.
...
declare module 'tls' {
import TcpSockets from 'react-native-tcp-socket' ;
export const Server = TcpSockets . TLSServer ;
export const TLSSocket = TcpSockets . TLSSocket ;
export const connect = TcpSockets . connectTLS ;
export const createServer = TcpSockets . createTLSServer ;
}Verifique o aplicativo de exemplo fornecido para um exemplo de funcionamento.
Vincular o pacote manualmente não é mais necessário com a automobilismo.
plataforma iOS:
$ cd ios && pod install && cd .. # cocoapods no iOS precisa desta etapa extra
Plataforma Android:
Modifique sua configuração android/build.gradle para corresponder minSdkVersion = 21 :
buildscript {
ext {
...
minSdkVersion = 21
...
}
Para gerar os arquivos necessários (chaves e certificados) para o SSL autoassinado, você pode usar o seguinte comando:
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server-csr.pem
openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
openssl pkcs12 -export -out server-keystore.p12 -inkey server-key.pem -in server-cert.pem
Nota: o server-keystore.p12 não deve ter uma senha.
Você precisará de um arquivo metro.config.js para usar um certificado SSL autoassinado. Você já deve ter esse arquivo no diretório do seu projeto root, mas se não o fizer, crie -o. Dentro de um objeto module.exports , crie uma chave chamada resolver com outro objeto chamado assetExts . O valor dos assetExts deve ser uma matriz das extensões de arquivo de recursos que você deseja oferecer suportar.
Se você deseja usar arquivos .pem e .p12 (além de todos os arquivos já suportados), seu metro.config.js deve ficar assim:
const { getDefaultConfig } = require ( 'metro-config' ) ;
const defaultConfig = getDefaultConfig . getDefaultValues ( __dirname ) ;
module . exports = {
resolver : {
assetExts : [ ... defaultConfig . resolver . assetExts , 'pem' , 'p12' ] ,
} ,
// ...
} ; Você precisa vincular as partes nativas da biblioteca para as plataformas que está usando. A maneira mais fácil de vincular a biblioteca é usar a ferramenta CLI executando este comando da raiz do seu projeto:
$ react-native link react-native-tcp-socket
Se você não pode ou não deseja usar a ferramenta da CLI, também pode vincular manualmente a biblioteca usando as instruções abaixo (clique na seta para mostrá -las):
Libraries Add Files to [your project's name]node_modules react-native-tcp-socket e adicione TcpSockets.xcodeprojlibTcpSockets.a às Build Phases do seu projeto Link Binary With LibrariesCmd+R ) <android/app/src/main/java/[...]/MainApplication.javaimport com.asterinet.react.tcpsocket.TcpSocketPackage; para as importações no topo do arquivonew TcpSocketPackage() à lista retornada pelo método getPackages()android/settings.gradle : include ':react-native-tcp-socket'
project(':react-native-tcp-socket').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-tcp-socket/android')
android/app/build.gradle : implementation project(':react-native-tcp-socket')
Para usar esta biblioteca, você precisa garantir que você esteja usando a versão correta do React Native. Se você estiver usando uma versão do React Native, que é inferior a 0.60 precisará atualizar antes de tentar usar a versão mais recente.
Versão react-native-tcp-socket | Versão nativa de reação necessária |
|---|---|
6.XX , 5.XX , 4.XX , 3.XX | >= 0.60.0 |
1.4.0 | >= Unknown |
Importar a biblioteca:
import TcpSocket from 'react-native-tcp-socket' ;
// const net = require('react-native-tcp-socket');
// const tls = require('react-native-tcp-socket'); const options = {
port : port ,
host : '127.0.0.1' ,
localAddress : '127.0.0.1' ,
reuseAddress : true ,
// localPort: 20000,
// interface: "wifi",
} ;
// Create socket
const client = TcpSocket . createConnection ( options , ( ) => {
// Write on the socket
client . write ( 'Hello server!' ) ;
// Close socket
client . destroy ( ) ;
} ) ;
client . on ( 'data' , function ( data ) {
console . log ( 'message was received' , data ) ;
} ) ;
client . on ( 'error' , function ( error ) {
console . log ( error ) ;
} ) ;
client . on ( 'close' , function ( ) {
console . log ( 'Connection closed!' ) ;
} ) ; const server = TcpSocket . createServer ( function ( socket ) {
socket . on ( 'data' , ( data ) => {
socket . write ( 'Echo server ' + data ) ;
} ) ;
socket . on ( 'error' , ( error ) => {
console . log ( 'An error ocurred with client socket ' , error ) ;
} ) ;
socket . on ( 'close' , ( error ) => {
console . log ( 'Closed connection with ' , socket . address ( ) ) ;
} ) ;
} ) . listen ( { port : 12345 , host : '0.0.0.0' } ) ;
server . on ( 'error' , ( error ) => {
console . log ( 'An error ocurred with the server' , error ) ;
} ) ;
server . on ( 'close' , ( ) => {
console . log ( 'Server closed connection' ) ;
} ) ; const options = {
port : port ,
host : '127.0.0.1' ,
localAddress : '127.0.0.1' ,
reuseAddress : true ,
// localPort: 20000,
// interface: "wifi",
ca : require ( 'server-cert.pem' ) ,
} ;
// Create socket
const client = TcpSocket . connectTLS ( options , ( ) => {
// Write on the socket
client . write ( 'Hello server!' ) ;
// Close socket
client . destroy ( ) ;
} ) ;
client . on ( 'data' , function ( data ) {
console . log ( 'message was received' , data ) ;
} ) ;
client . on ( 'error' , function ( error ) {
console . log ( error ) ;
} ) ;
client . on ( 'close' , function ( ) {
console . log ( 'Connection closed!' ) ;
} ) ; const options = {
keystore : require ( 'server-keystore.p12' ) ,
} ;
const server = TcpSocket . createTLSServer ( options , function ( socket ) {
socket . on ( 'data' , ( data ) => {
socket . write ( 'Echo server ' + data ) ;
} ) ;
socket . on ( 'error' , ( error ) => {
console . log ( 'An error ocurred with SSL client socket ' , error ) ;
} ) ;
socket . on ( 'close' , ( error ) => {
console . log ( 'SSL closed connection with ' , socket . address ( ) ) ;
} ) ;
} ) . listen ( { port : 12345 , host : '0.0.0.0' } ) ;
server . on ( 'error' , ( error ) => {
console . log ( 'An error ocurred with the server' , error ) ;
} ) ;
server . on ( 'close' , ( ) => {
console . log ( 'Server closed connection' ) ;
} ) ;NOTA: Para usar certificados autoassinados, certifique-se de atualizar sua configuração metro.config.js.
Aqui estão listados todos os métodos implementados no react-native-tcp-socket que imitam a API líquida do Node, suas funcionalidades são equivalentes às fornecidas pela rede do Node (mais informações sobre #41). No entanto, os métodos cuja interface difere do nó são marcados em negrito .
net.connect(options[, callback])net.createConnection(options[, callback])net.createServer(connectionListener)net.isIP(input)net.isIPv4(input)net.isIPv6(input)address()destroy([error])end([data][, encoding][, callback])setEncoding([encoding])setKeepAlive([enable][, initialDelay]) - initialDelay é ignoradosetNoDelay([noDelay])setTimeout(timeout[, callback])write(data[, encoding][, callback])pause()ref() - não terá nenhum efeitoresume()unref() - não terá nenhum efeitoStream.Writable :writableNeedDrainbytesReadbytesWrittenconnectingdestroyedlocalAddresslocalPortremoteAddressremoteFamilyremotePortpendingtimeoutreadyStateStream.Readable :'pause''resume''close''connect''data''drain''error''timeout'net.createConnection() net.createConnection(options[, callback]) cria uma conexão TCP usando as options fornecidas. O parâmetro options deve ser um object com as seguintes propriedades:
| Propriedade | Tipo | iOS/macOS | Android | Descrição |
|---|---|---|---|---|
port | <number> | Obrigatório . Porta o soquete deve se conectar. | ||
host | <string> | Host O soquete deve se conectar. Endereço IP no formato IPv4 ou 'localhost' . Padrão : 'localhost' . | ||
localAddress | <string> | Endereço local O soquete deve se conectar. Se não for especificado, o sistema operacional decidirá. É altamente recomendável especificar um localAddress para evitar erros de sobrecarga e melhorar o desempenho. | ||
localPort | <number> | Porta local em que o soquete deve se conectar. Se não for especificado, o sistema operacional decidirá. | ||
interface | <string> | Interface O soquete deve se conectar. Se não for especificado, ele usará a conexão ativa atual. As opções são: 'wifi', 'ethernet', 'cellular' . | ||
reuseAddress | <boolean> | Ativar/desativar a opção de soquete reuseaddress. Padrão : true . |
Nota : As plataformas marcadas como usam o valor padrão.
address()listen(options[, callback])close([callback])getConnections(callback)listening'close''connection''error''listening'Server.listen() Server.listen(options[, callback]) cria um soquete do servidor TCP usando as options fornecidas. O parâmetro options deve ser um object com as seguintes propriedades:
| Propriedade | Tipo | iOS/macOS | Android | Descrição |
|---|---|---|---|---|
port | <number> | Obrigatório . Porta o soquete deve ouvir. | ||
host | <string> | Hospedar o soquete deve ouvir. Endereço IP no formato IPv4 ou 'localhost' . Padrão : '0.0.0.0' . | ||
reuseAddress | <boolean> | Ativar/desativar a opção de soquete reuseaddress. Padrão : true . |
Nota : As plataformas marcadas como usam o valor padrão.
Aqui estão listados todos os métodos implementados no react-native-tcp-socket que imitam a API TLS do Node, suas funcionalidades são equivalentes às fornecidas pelo TLS do Node. No entanto, os métodos cuja interface difere do nó são marcados em negrito .
tls.connectTLS(options[, callback])tls.createTLSServer([options][, secureConnectionListener])SocketgetCertificate() apenas AndroidgetPeerCertificate() apenas AndroidSocketSocket'secureConnect'tls.connectTLS() tls.connectTLS(options[, callback]) cria uma conexão de soquete TLS usando as options fornecidas. O parâmetro options deve ser um object com as seguintes propriedades:
| Propriedade | Tipo | iOS/macOS | Android | Descrição |
|---|---|---|---|---|
ca | <import> | Arquivo CA (formato .PEM) para confiar. Se null , ele usará a lista SSL padrão do dispositivo. Útil para certificados autoassinados. Verifique a documentação para gerar esse arquivo . Padrão : null . | ||
key | <import> | Arquivo de chave privada (formato .pem). Verifique a documentação para gerar esse arquivo . | ||
cert | <import> | Arquivo de certificado público (formato .pem). Verifique a documentação para gerar esse arquivo . | ||
androidKeyStore | <string> | Android Keystore Alias. | ||
certAlias | <string> | Alias de certificado do Android Keystore. | ||
keyAlias | <string> | Android Keystore private Key Alias. | ||
... | <any> | Quaisquer outras opções de socket.connect() ainda não listadas. |
NOTA : O servidor TLS é nomeado Server no TLS do Node, mas é nomeado TLSServer no react-native-tcp-socket para evitar confusão com a classe Server .
ServersetSecureContext(options)ServerServer'secureConnection'tls.createTLSServer() tls.createTLSServer([options][, secureConnectionListener]) cria um novo tls.TLSServer . O secureConnectionListener , se fornecido, é definido automaticamente como ouvinte para o evento 'secureConnection' . O parâmetro options deve ser um object com as seguintes propriedades:
| Propriedade | Tipo | iOS/macOS | Android | Descrição |
|---|---|---|---|---|
keystore | <import> | Obrigatório . Armazenamento de chave no formato PKCS#12 com o certificado do servidor e a chave privada. Verifique a documentação para gerar esse arquivo . |
A biblioteca é liberada sob a licença do MIT. Para mais informações, consulte LICENSE .