English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

المحاور لإrlang

في Erlang، يتم استخدام البوابة للتواصل بين برامج مختلفة. الجهاز هو نقطة اتصال للتواصل، ويسمح للكمبيوتر بالتواصل عبر الإنترنت باستخدام بروتوكول الإنترنت (IP) عبر الإنترنت.

نوع البروتوكول المستخدم في البوابة

هناك نوعان من البروتوكولات يمكن استخدامها للتواصل. واحد هو UDP، والآخر هو TCP. يسمح UDP للبرامج بتبادل رسائل قصيرة (تسمى بيانات) بين بعضها البعض، لكنه لا يضمن تسليم هذه الرسائل. قد تحدث أيضًا أخطاء. من ناحية أخرى، يوفر TCP تدفقًا من البيانات موثوقًا به، حيث يتم نقل البيانات في ترتيبها فقط إذا تم إنشاء الاتصال.

دعونا نرى مثالاً بسيطاً على كيفية فتح بوابة باستخدام UDP.

مثال

-module(helloworld). 
-export([start/0]). 
start() ->
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send 
   (Socket,"localhost",8789,"Hello")]).

النص

إليك خروج البرنامج أعلاه.

#Port<0.376>ok

استقبال الرسائل على البوابة

بعد فتح البوابة، يمكن استقبال رسالة أخرى على البوابة. يتم ذلك من خلال طريقة recv. دعونا نرى النحو وال مثال أدناه.

النحو

recv(Socket, length)

المتغيرات

  • Socket −هذا هو套 Jaez تم إنشاؤه باستخدام الأمر gen_udp:open.

  • Length −هذا هو طول الرسالة التي يجب استقبالها.

قيمة الإرجاع

إذا تم إرسال الرسالة بشكل صحيح، يتم إرجاع رسالة تأكيد.

例如

-module(helloworld). 
-export([start/0]). 
start() ->
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]),
   io:fwrite("~p",[gen_udp:recv(Socket, 20)]).

البرنامج الكامل

الآن من الواضح أننا لا يمكن أن نمتلك نفس الرسائل المرسلة والمنظمة في نفس البرنامج. يجب عليك تعريفها في برامج مختلفة. لذا، دعونا ننشئ الكود التالي، والذي يخلق مكون الخادم المستمع للرسائل ومكون العميل المرسل للرسائل.

مثال

-module(helloworld). 
-export([start/0,client/1]). 
start() -> 
   spawn(fun() -> server(4000) end).
server(Port) ->
   {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), 
   io:format("الخادم فتح وحدة الاتصال:~p~n",[Socket]), 
   loop(Socket). 
loop(Socket) ->
   inet:setopts(Socket, [{active, once}]), 
   receive 
      {udp, Socket, Host, Port, Bin} -> 
      io:format("الخادم استلم:~p~n",[Bin]), 
      gen_udp:send(Socket, Host, Port, Bin), 
      loop(Socket) 
   end. 
client(N) -> 
   {ok, Socket} = gen_udp:open(0, [binary]), 
   io:format("العميل فتح وحدة الاتصال=~p~n",[Socket]), 
   ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive 
      {udp, Socket, _, _, Bin} ->
         io:format("العميل استلم:~p~n",[Bin]) بعد 2000 ->
      0 
   fini, 
   
gen_udp:close(Socket), 
القيمة.

عن البرنامج المذكور أعلاه، يجب مراعاة النقاط التالية.

  • لقد قمنا بتعريف اثنين من الوظائف، الأولى هي وظيفة الخادم. سيتم استخدامها لمراقبة المحور 4000. الثانية هي العميل، وستستخدم لتسليم رسالة “Hello” إلى مكون الخادم.

  • الاستقبال في الدورات المستمرة用于 قراءة الرسائل التي يتم إرسالها داخل الدورات المحددة.

النص

الآن تحتاج إلى تشغيل البرنامج من نافذتين. النافذة الأولى ستقوم بتشغيل مكون الخادم عن طريق تشغيل الكود التالي في نافذة سطر الأوامر erl.

helloworld:start().

سيتم عرض النص التالي في نافذة سطر الأوامر.

server opened socket:#Port<0.2314>

الآن، قم بتشغيل الأمر التالي في نافذة الأوامر الثانية الخاصة بـ erl.

Helloworld:client(“<<Hello>>”).

عند إرسال هذا الأمر، النص التالي سيظهر في نافذة الأوامر الأولى.

server received:<<"Hello">>