لنبدأ بمثال بسيط - خدمة TCP التي تتلقى سلسلة إدخال وتعالج هذه السلسلة وتعيدها إلى العميل، إليك الكود المقابل:
كود PHP:
<?
// 设置一些基本的变量
$host = "192.168.1.99" ;
$port = 1234 ;
// 设置超时时间
set_time_limit ( 0 );
// 创建一个Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create
socketn" );
//绑定Socket到端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to
socketn" );
// 开始监听链接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket
listenern" );
// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming
connectionn" );
// 获得客户端的输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
// 清空输入字符串
$input = trim ( $input );
//处理客户端输入并返回结果
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write
outputn" );
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>
فيما يلي وصف تفصيلي لكل خطوة:
1. الخطوة الأولى هي إنشاء متغيرين لحفظ عنوان IP ومنفذ الخادم الذي يعمل عليه المقبس، ويمكنك ضبطه على الخادم والمنفذ الخاص بك (يمكن أن يكون هذا المنفذ رقمًا بين 1 و65535)، بشرط. أن هذا المنفذ غير مستخدم.
كود PHP:
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. يمكنك استخدام الدالة set_time_out() من جانب الخادم لضمان عدم انتهاء مهلة PHP أثناء انتظار اتصال العميل.
كود PHP:
<?
// 超时时间
set_time_limit ( 0 );
?>
3. بناءً على الوظائف السابقة، فقد حان الوقت لإنشاء مقبس باستخدام وظيفة المقبس ()socket_creat --- تقوم هذه الوظيفة بإرجاع مقبض المقبس، والذي سيتم استخدامه في جميع الوظائف اللاحقة.
كود PHP:
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
يتم استخدام المعلمة الأولى "AF_INET" لتحديد اسم المجال؛
تخبر المعلمة الثانية "SOCK_STREM" الوظيفة بنوع المقبس الذي سيتم إنشاؤه (نوع TCP في هذا المثال)
لذلك، إذا كنت تريد إنشاء مقبس UDP، يمكنك استخدام الكود التالي:
كود PHP:
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. بمجرد إنشاء مقبض المقبس، فإن الخطوة التالية هي تحديده أو ربطه بالعنوان والمنفذ المحددين. ويمكن القيام بذلك من خلال وظيفة المقبس ()socket_bind.
كود PHP:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. بعد إنشاء المقبس وربطه بمنفذ، يمكنك البدء في الاستماع للاتصالات الخارجية. PHP تسمح لك ببدء الاستماع من خلال وظيفة المقبس ()socket_listen، ويمكنك تحديد رقم (في هذا المثال هو الثاني). المعلمة: 3)
كود PHP:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. حتى الآن، لم يقم خادمك بأي شيء باستثناء انتظار طلب الاتصال من العميل. بمجرد تلقي اتصال العميل، يتم تشغيل وظيفة المقبس ()socket، حيث تتلقى طلب الاتصال وتستدعي فرعيًا آخر. يعالج المقبس معلومات خادم العميل.
كود PHP:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
يمكن الآن استخدام هذا المقبس الفرعي للاتصالات اللاحقة بين العميل والخادم.
7. عند إنشاء اتصال، سينتظر الخادم العميل لإرسال بعض معلومات الإدخال، ويمكن الحصول على هذه المعلومات عن طريق وظيفة المقبس () وتخصيصها لمتغير الإدخال $ في PHP.
كود PHP:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
يتم استخدام المعلمة الثانية لـ socker_read لتحديد عدد البايتات المراد قراءتها. يمكنك استخدامها لتحديد حجم البيانات التي تم الحصول عليها من العميل.
ملاحظة: ستستمر الدالة مقبس القراءة في قراءة بيانات عميل الصدفة حتى تواجه الأحرف n أو t أو . ويعتبر البرنامج النصي PHP هذه الأحرف بمثابة نهاية الإدخال.
8. الآن يجب على الخادم معالجة البيانات المرسلة من قبل العميل (في هذا المثال، تتضمن المعالجة فقط إدخال البيانات وإعادتها إلى العميل، ويمكن إكمال هذا الجزء بواسطة وظيفة المقبس_الكتابة () (بحيث يتم إرسال البيانات من خلال مقبس الاتصال من الممكن إرجاع دفق البيانات إلى العميل)
كود PHP:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. بمجرد إرجاع المخرجات إلى العميل، يجب إنهاء المقبس الأصلي/الفرعي من خلال الدالة مقبس_إغلاق ()
كود PHP:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>