React Native TCP Socket API для Android, iOS и MacOS с поддержкой SSL/TLS . Это позволяет создавать клиентские и серверные розетки TCP, подражая Net Node и функциональности API API Node Node (проверьте доступный API для получения дополнительной информации).
nettlsУстановите библиотеку, используя любую пряжу:
yarn add react-native-tcp-socket
или NPM:
npm install --save react-native-tcp-socket
net Поскольку react-native-tcp-socket предлагает тот же API, что и сеть узла, если вы хотите импортировать этот модуль в качестве net или использования require('net') в своем JavaScript, вы должны добавить следующие строки в свой файл package.json .
{
"react-native" : {
"net" : " react-native-tcp-socket "
}
}Кроме того, для получения типов TS (или автозаполнения), предоставленных этим модулем, вы также должны добавить следующее в ваш пользовательский файл объявлений.
...
declare module 'net' {
import TcpSockets from 'react-native-tcp-socket' ;
export = TcpSockets ;
} tsconfig.json вы хотите избежать дублированных net типов, убедитесь, что не используйте node_modules/@types "typeRoots"
Проверьте пример приложения, представленное для рабочего примера.
tls То же самое относится и к модулю tls . Однако вы должны знать о следующем:
Server , экспортируемый по умолчанию, не является TLS. Чтобы использовать TLS -сервер, вы должны использовать класс TLSServer . Вы можете переопределить класс Server по умолчанию ( tls.Server = tls.TLSServer ). То же самое касается createServer() и connect() . Чтобы использовать методы TLS, вы должны использовать методы createTLSServer() и connectTLS() соответственно. Вы можете переопределить методы по умолчанию ( tls.createServer = tls.createTLSServer и tls.connect = tls.connectTLS ).tls у Node требует, чтобы ключи и сертификаты были предоставлены в качестве строки. Тем не менее, модуль react-native-tcp-socket требует, чтобы они были импортированы с помощью require() .Кроме того, для получения типов TS (или автозаполнения), предоставленных этим модулем, вы также должны добавить следующее в ваш пользовательский файл объявлений.
...
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 ;
}Проверьте пример приложения, представленное для рабочего примера.
Связывание пакета вручную больше не требуется с помощью автоматического изготовления.
Платформа iOS:
$ cd ios && pod install && cd .. # cocoapods на iOS нуждается в этом дополнительном шаге
Android Platform:
Измените конфигурацию android/build.gradle в соответствии с minSdkVersion = 21 :
buildscript {
ext {
...
minSdkVersion = 21
...
}
Чтобы сгенерировать необходимые файлы (ключи и сертификаты) для самореагированного SSL, вы можете использовать следующую команду:
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
Примечание. server-keystore.p12 не должен иметь пароль.
Вам понадобится файл metro.config.js, чтобы использовать самореагированный сертификат SSL. У вас уже должен быть этот файл в каталоге корневых проектов, но если вы этого не сделаете, создайте его. Внутри объекта module.exports создайте ключ, называемый resolver с другим объектом, называемым assetExts . Значение assetExts должно быть массивом расширений файлов ресурсов, которые вы хотите поддержать.
Если вы хотите иметь возможность использовать файлы .pem и .p12 (плюс все уже поддерживаемые файлы), ваш metro.config.js должен выглядеть следующим образом:
const { getDefaultConfig } = require ( 'metro-config' ) ;
const defaultConfig = getDefaultConfig . getDefaultValues ( __dirname ) ;
module . exports = {
resolver : {
assetExts : [ ... defaultConfig . resolver . assetExts , 'pem' , 'p12' ] ,
} ,
// ...
} ; Затем вам нужно связать собственные части библиотеки для платформ, которые вы используете. Самый простой способ связать библиотеку использует инструмент CLI, запустив эту команду из корня вашего проекта:
$ react-native link react-native-tcp-socket
Если вы не можете или не хотите использовать инструмент CLI, вы также можете вручную связать библиотеку, используя инструкции ниже (нажмите на стрелку, чтобы показать их):
Libraries правой щелчки Add Files to [your project's name]node_modules react-native-tcp-socket и добавьте TcpSockets.xcodeprojlibTcpSockets.a к Build Phases вашего проекта. Link Binary With LibrariesCmd+R ) <android/app/src/main/java/[...]/MainApplication.javaimport com.asterinet.react.tcpsocket.TcpSocketPackage; в импорт в верхней части файлаnew TcpSocketPackage() в список, возвращаемый методом 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')
Чтобы использовать эту библиотеку, вам необходимо убедиться, что вы используете правильную версию React Native. Если вы используете версию Native Native, которая ниже 0.60 вам нужно будет обновить, прежде чем попытаться использовать последнюю версию.
react-native-tcp-socket | Требуемая версия React Native |
|---|---|
6.XX , 5.XX , 4.XX , 3.XX | >= 0.60.0 |
1.4.0 | >= Unknown |
Импортировать библиотеку:
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' ) ;
} ) ;ПРИМЕЧАНИЕ. Для использования саморегистрированных сертификатов обязательно обновите конфигурацию Metro.config.js.
Здесь перечислены все методы, реализованные в react-native-tcp-socket , которые подражают чистому API Node Node, их функциональные возможности эквивалентны тем, которые предоставляются Node Net (дополнительная информация о #41). Тем не менее, методы, чей интерфейс отличается от узла, отмечены жирным шрифтом .
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 игнорируетсяsetNoDelay([noDelay])setTimeout(timeout[, callback])write(data[, encoding][, callback])pause()ref() - не будет иметь никакого влиянияresume()unref() - не будет иметь никакого влиянияStream.Writable :writableNeedDrainbytesReadbytesWrittenconnectingdestroyedlocalAddresslocalPortremoteAddressremoteFamilyremotePortpendingtimeoutreadyStateStream.Readable :'pause''resume''close''connect''data''drain''error''timeout'net.createConnection() net.createConnection(options[, callback]) создает соединение TCP с использованием заданных options . Параметр options должен быть object со следующими свойствами:
| Свойство | Тип | iOS/macOS | Android | Описание |
|---|---|---|---|---|
port | <number> | Необходимый . Порт. | ||
host | <string> | Хост, к которому должен подключиться. IP -адрес в формате IPv4 или 'localhost' . По умолчанию : 'localhost' . | ||
localAddress | <string> | Локальный адрес, от которого следует подключиться. Если не указано, ОС примет решение. Настоятельно рекомендуется указать localAddress для предотвращения ошибок перегрузки и повышения производительности. | ||
localPort | <number> | Локальный порт. Если не указано, ОС примет решение. | ||
interface | <string> | Интерфейс. Гребень должен подключиться к. Если не указано, он будет использовать текущее активное соединение. Варианты: 'wifi', 'ethernet', 'cellular' . | ||
reuseAddress | <boolean> | Включите/отключите опцию reuseaddress сокета. По умолчанию : true . |
ПРИМЕЧАНИЕ . Платформы, отмеченные как значение по умолчанию.
address()listen(options[, callback])close([callback])getConnections(callback)listening'close''connection''error''listening'Server.listen() Server.listen(options[, callback]) создает сокет TCP -сервера, используя заданные options . Параметр options должен быть object со следующими свойствами:
| Свойство | Тип | iOS/macOS | Android | Описание |
|---|---|---|---|---|
port | <number> | Необходимый . Порт. Гребень должен слушать. | ||
host | <string> | Хозяин IP -адрес в формате IPv4 или 'localhost' . По умолчанию : '0.0.0.0' . | ||
reuseAddress | <boolean> | Включите/отключите опцию reuseaddress сокета. По умолчанию : true . |
ПРИМЕЧАНИЕ . Платформы, отмеченные как значение по умолчанию.
Здесь перечислены все методы, реализованные в рамках react-native-tcp-socket , которые имитируют API TLS Node Node, их функциональные возможности эквивалентны тем, которые предоставляются TLS узла. Тем не менее, методы, чей интерфейс отличается от узла, отмечены жирным шрифтом .
tls.connectTLS(options[, callback])tls.createTLSServer([options][, secureConnectionListener])SocketgetCertificate() только для AndroidgetPeerCertificate() только для AndroidSocketSocket'secureConnect'tls.connectTLS() tls.connectTLS(options[, callback]) создает подключение к сокету TLS, используя заданные options . Параметр options должен быть object со следующими свойствами:
| Свойство | Тип | iOS/macOS | Android | Описание |
|---|---|---|---|---|
ca | <import> | CA файл (.pem format) для доверия. Если null , он будет использовать доверенный список SSL по умолчанию устройства. Полезно для самоопределенных сертификатов. Проверьте документацию для создания такого файла . По умолчанию : null . | ||
key | <import> | Файл закрытого ключа (формат .pem). Проверьте документацию для создания такого файла . | ||
cert | <import> | Общественный файл сертификата (формат .pem). Проверьте документацию для создания такого файла . | ||
androidKeyStore | <string> | Android -Key Store Alias. | ||
certAlias | <string> | Сертификат Android -магазина. Сертификат. | ||
keyAlias | <string> | Android KeyStore Private Key Alias. | ||
... | <any> | Любые другие параметры socket.connect() еще не указаны. |
ПРИМЕЧАНИЕ . Сервер TLS называется Server в TLS Node, но он называется TLSServer в react-native-tcp-socket , чтобы избежать путаницы с классом Server .
ServersetSecureContext(options)ServerServer'secureConnection'tls.createTLSServer() tls.createTLSServer([options][, secureConnectionListener]) создает новый tls.TLSServer . secureConnectionListener , если предоставлен, автоматически устанавливается в качестве слушателя для события 'secureConnection' . Параметр options должен быть object со следующими свойствами:
| Свойство | Тип | iOS/macOS | Android | Описание |
|---|---|---|---|---|
keystore | <import> | Необходимый . Ключевой магазин в формате PKCS#12 с сертификатом сервера и закрытым ключом. Проверьте документацию для создания такого файла . |
Библиотека выпускается по лицензии MIT. Для получения дополнительной информации см. LICENSE .