เริ่มต้นด้วยตัวอย่างง่ายๆ - บริการ 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 โดยใช้ฟังก์ชัน socket_creat() --- ฟังก์ชันนี้จะส่งคืนหมายเลขอ้างอิง Socket ซึ่งจะใช้ในฟังก์ชันต่อๆ ไปทั้งหมด
รหัส 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 handle แล้ว ขั้นตอนต่อไปคือการระบุหรือผูกเข้ากับที่อยู่และพอร์ตที่ระบุ ซึ่งสามารถทำได้ผ่านฟังก์ชัน socket_bind()
รหัส PHP:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. หลังจากสร้าง Socket และเชื่อมโยงกับพอร์ตแล้ว คุณสามารถเริ่มฟังการเชื่อมต่อภายนอกได้ PHP ช่วยให้คุณสามารถเริ่มฟังผ่านฟังก์ชัน socket_listen() และคุณสามารถระบุตัวเลขได้ (ในตัวอย่างนี้ มันเป็นตัวที่สอง พารามิเตอร์: 3)
รหัส PHP:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. จนถึงตอนนี้ เซิร์ฟเวอร์ของคุณไม่ได้ทำอะไรเลยนอกจากรอคำขอการเชื่อมต่อจากไคลเอนต์ เมื่อได้รับการเชื่อมต่อไคลเอนต์ ฟังก์ชัน socket_assept() จะเริ่มทำงาน โดยจะได้รับคำขอการเชื่อมต่อและเรียกคำสั่งย่อยอื่น ซ็อกเก็ตจัดการข้อมูลไคลเอนต์เซิร์ฟเวอร์
รหัส PHP:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
ซ็อกเก็ตย่อยนี้สามารถใช้สำหรับการสื่อสารไคลเอนต์-เซิร์ฟเวอร์ในภายหลังได้
7. เมื่อสร้างการเชื่อมต่อแล้ว เซิร์ฟเวอร์จะรอให้ไคลเอ็นต์ส่งข้อมูลอินพุตบางส่วน ข้อมูลนี้สามารถรับได้จากฟังก์ชัน socket_read() และกำหนดให้กับตัวแปร $input ของ PHP
รหัส PHP:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
พารามิเตอร์ที่สองของ socker_read ใช้เพื่อระบุจำนวนไบต์ที่จะอ่าน คุณสามารถใช้เพื่อจำกัดขนาดของข้อมูลที่ได้รับจากไคลเอนต์
หมายเหตุ: ฟังก์ชัน socket_read จะยังคงอ่านข้อมูลเชลล์ไคลเอ็นต์ต่อไปจนกว่าจะพบอักขระ n, t หรือ สคริปต์ PHP ถือว่าอักขระเหล่านี้เป็นจุดสิ้นสุดของอินพุต
8. ตอนนี้เซิร์ฟเวอร์จะต้องประมวลผลข้อมูลที่ส่งโดยไคลเอนต์ (ในตัวอย่างนี้ การประมวลผลจะรวมเฉพาะการป้อนข้อมูลและการส่งคืนข้อมูลไปยังไคลเอนต์) ส่วนนี้สามารถทำได้โดยใช้ฟังก์ชัน socket_write() (เพื่อให้ข้อมูลที่ส่ง โดยซ็อกเก็ตการสื่อสาร สามารถส่งคืนกระแสข้อมูลไปยังไคลเอนต์ได้)
รหัส PHP:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. เมื่อเอาต์พุตถูกส่งกลับไปยังไคลเอนต์แล้ว ซ็อกเก็ตพาเรนต์/รองควรถูกยกเลิกผ่านฟังก์ชัน socket_close()
รหัส PHP:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>