Heim  >  Artikel  >  php教程  >  php socket 多客户端连接示例

php socket 多客户端连接示例

WBOY
WBOYOriginal
2016-06-06 20:13:131861Durchsuche

?php/*** File name server.php* 服务器端代码** @author bandit* @since 2014-09-09**///确保在连接客户端时不会超时set_time_limit(0);//设置IP和端口号$address = localhost;//$port =rand(3000,6000);$port = 8081; //调试的时候,可以多换端口来测试程

<?php /**
* File name server.php
* 服务器端代码
*
* @author bandit
* @since 2014-09-09
*
*/
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "localhost";
//$port =rand(3000,6000);
$port = 8081; //调试的时候,可以多换端口来测试程序!
/**
* 创建一个SOCKET
* AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
* SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
*/
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//端口复用
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
}
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
echo "OK\nBinding the socket on $address:$port ... ";
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
while(true){
$pid = pcntl_fork();
if($pid == -1){
die('fork error');
}elseif($pid){
//父进程会得到子进程号,所以这里是父进程执行的逻辑
//pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
}else{
//$msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
while($msgsock = socket_accept($sock)){
//它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
do{
//读取客户端数据
echo "Read client data \n";
//socket_read函数会一直读取客户端数据,直到遇见\n,\t或者&#92;&#48;字符.PHP脚本把这写字符看做是输入的结束符.
$buf = socket_read($msgsock, 8192);
echo "Received msg: $buf?? \n";
$msg = "you said $buf \n";
socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
}while(true);
socket_close($msgsock);
}
}
}
socket_close($sock);
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn