React React Native TCP Socket API لنظام Android و iOS و MACOS مع دعم SSL/TLS . يتيح لك إنشاء مآخذ عميل وخادم TCP ، وتقليد Net Net Net و Node's TLS API (تحقق من واجهة برمجة التطبيقات المتوفرة لمزيد من المعلومات).
net الغالبةtlsقم بتثبيت المكتبة باستخدام أي غزل:
yarn add react-native-tcp-socket
أو NPM:
npm install --save react-native-tcp-socket
net الغالبة نظرًا لأن react-native-tcp-socket يوفر نفس واجهة برمجة التطبيقات (API) مثل شبكة Node ، في حالة رغبتك في استيراد هذه الوحدة 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 ;
} إذا كنت ترغب في تجنب أنواع net مكررة ، فتأكد من عدم استخدام node_modules/@types في خاصية tsconfig.json "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 للعقدة أن يتم تقديم المفاتيح والشهادات كسلسلة. ومع ذلك ، فإن وحدة 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 on 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 موقعة ذاتيا. يجب أن يكون لديك هذا الملف بالفعل في دليل مشروع الجذر الخاص بك ، ولكن إذا لم تقم بذلك ، فإنه ينشئه. داخل 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. إذا كنت تستخدم إصدارًا من React Native أقل من 0.60 ، فستحتاج إلى الترقية قبل محاولة استخدام أحدث إصدار.
إصدار react-native-tcp-socket | مطلوب رد فعل React الأصلي |
|---|---|
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 والتي تقلد صافي واجهة برمجة التطبيقات (NODE) ، فإن وظائفها تعادل تلك التي توفرها NODE's 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]) ينشئ اتصال 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 للعقدة ، فإن وظائفها تعادل تلك التي توفرها TLS للعقدة. ومع ذلك ، يتم وضع علامة على الطرق التي تختلف واجهتها من العقدة بالخط العريض .
tls.connectTLS(options[, callback])tls.createTLSServer([options][, secureConnectionListener])SocketgetCertificate() Android فقطgetPeerCertificate() Android فقطSocketSocket'secureConnect'tls.connectTLS() tls.connectTLS(options[, callback]) ينشئ اتصال مقبس TLS باستخدام options المحددة. يجب أن تكون معلمة options object له الخصائص التالية:
| ملكية | يكتب | iOS/macos | Android | وصف |
|---|---|---|---|---|
ca | <import> | ملف CA (تنسيق .pem) للثقة. إذا كانت null ، فسيستخدم قائمة SSL الموثوق بها في الجهاز. مفيد للشهادات الموقعة ذاتيا. تحقق من الوثائق لإنشاء مثل هذا الملف . الافتراضي : null . | ||
key | <import> | ملف المفتاح الخاص (.pem format). تحقق من الوثائق لإنشاء مثل هذا الملف . | ||
cert | <import> | ملف الشهادة العام (.pem format). تحقق من الوثائق لإنشاء مثل هذا الملف . | ||
androidKeyStore | <string> | Android Keystore الاسم المستعار. | ||
certAlias | <string> | Android Keystore شهادة الاسم المستعار. | ||
keyAlias | <string> | Android Keystore الاسم المستعار المفتاح الخاص. | ||
... | <any> | أي خيارات أخرى socket.connect() غير مدرجة بالفعل. |
ملاحظة : تم تسمية خادم TLS Server في TLS للعقدة ، ولكن تم تسميته 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 مع شهادة الخادم والمفتاح الخاص. تحقق من الوثائق لإنشاء مثل هذا الملف . |
يتم إصدار المكتبة تحت رخصة معهد ماساتشوستس للتكنولوجيا. لمزيد من المعلومات ، انظر LICENSE .