React Antial TCP套接字API用于Android,iOS和MACOS具有SSL/TLS支持。它允许您创建TCP客户端和服务器插座,模仿Node的Net和Node的TLS API功能(查看可用API以获取更多信息)。
nettls使用任何一条纱线安装库:
yarn add react-native-tcp-socket
或NPM:
npm install --save react-native-tcp-socket
net由于react-native-tcp-socket提供与Node Net相同的API,如果您想在JavaScript中导入此模块作为net或使用require('net') ,则必须在package.json文件中添加以下行。
{
"react-native" : {
"net" : " react-native-tcp-socket "
}
}此外,要获取本模块提供的TS类型(或自动完成),还必须将以下内容添加到自定义声明文件中。
...
declare module 'net' {
import TcpSockets from 'react-native-tcp-socket' ;
export = TcpSockets ;
}如果要避免重复的net类型,请确保不要在tsconfig.json "typeRoots"属性中使用默认的node_modules/@types 。
检查为工作示例提供的示例应用程序。
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模块需要以字符串提供键和证书。但是, 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 .. #iOS上的可可录
Android平台:
修改您的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证书。您应该已经在Root Project目录中有此文件,但是如果您不这样做,请创建它。在module.exports内部。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。如果您使用的是低于0.60的React本机版本,则需要在尝试使用最新版本之前升级。
react-native-tcp-socket版本 | 必需的反应本机版本 |
|---|---|
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中实现的所有方法,该方法模仿了节点的NET API,它们的功能与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]) initialDelaysetNoDelay([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])使用给定options创建TCP连接。 options参数必须是具有以下属性的object :
| 财产 | 类型 | iOS/macOS | 安卓 | 描述 |
|---|---|---|---|---|
port | <number> | 必需的。端口应连接到插座。 | ||
host | <string> | 主机应连接到插座。 IPv4格式或'localhost'的IP地址。默认值: '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])使用给定options创建一个TCP服务器套接字。 options参数必须是具有以下属性的object :
| 财产 | 类型 | iOS/macOS | 安卓 | 描述 |
|---|---|---|---|---|
port | <number> | 必需的。端口应聆听插座。 | ||
host | <string> | 主持插座应该听。 IPv4格式或'localhost'的IP地址。默认值: '0.0.0.0' 。 | ||
reuseAddress | <boolean> | 启用/禁用ReuseadDress插座选项。默认值: true 。 |
注意:标记为使用默认值的平台。
以下列出了在react-native-tcp-socket中实现的所有方法,该方法模仿了Node的TLS API,它们的功能等同于Node的TLS提供的功能。但是,接口与节点不同的方法以粗体标记。
tls.connectTLS(options[, callback])tls.createTLSServer([options][, secureConnectionListener])Socket的所有方法getCertificate()仅AndroidgetPeerCertificate() AndroidSocket的所有属性Socket的所有事件'secureConnect'tls.connectTLS() tls.connectTLS(options[, callback])使用给定options创建一个TLS套接字连接。 options参数必须是具有以下属性的object :
| 财产 | 类型 | iOS/macOS | 安卓 | 描述 |
|---|---|---|---|---|
ca | <import> | CA文件(.pem格式)信任。如果null ,它将使用设备的默认SSL受信任列表。对于自签名证书有用。检查文档以生成该文件。默认值: null 。 | ||
key | <import> | 私有密钥文件(.pem格式)。检查文档以生成该文件。 | ||
cert | <import> | 公共证书文件(.PEM格式)。检查文档以生成该文件。 | ||
androidKeyStore | <string> | Android钥匙店别名。 | ||
certAlias | <string> | Android密钥店证书别名。 | ||
keyAlias | <string> | Android密钥店私钥别名。 | ||
... | <any> | 尚未列出的任何其他socket.connect()选项。 |
注意:TLS服务器在Node的TLS中命名为Server ,但在react-native-tcp-socket中命名为TLSServer ,以避免与Server类混淆。
Server的所有方法setSecureContext(options)Server的所有属性Server的所有事件'secureConnection'tls.createTLSServer() tls.createTLSServer([options][, secureConnectionListener])创建了一个新的tls.TLSServer 。 secureConnectionListener (如果提供)将自动设置为'secureConnection'事件的侦听器。 options参数必须是具有以下属性的object :
| 财产 | 类型 | iOS/macOS | 安卓 | 描述 |
|---|---|---|---|---|
keystore | <import> | 必需的。 PKCS#12格式的键存储,带有服务器证书和私钥。检查文档以生成该文件。 |
图书馆根据麻省理工学院许可发布。有关更多信息,请参阅LICENSE 。