魏长东

weichangdong

php的socket学习笔记

用php的socket实现了:

客户端发送信息=》服务器收到信息=》客户端收到服务器的返回信息=》显示出来

代码是网上copy别人的,自己搭建环境执行了下。

server.php 服务端文件

<?php
error_reporting(E_ALL);
set_time_limit(0);
//ob_implicit_flush();
$address = '127.0.0.1';
$port = 10005;
//创建端口
if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
	echo "socket_create() failed :reason:" . 
socket_strerror(socket_last_error()) . "\n";
}
//绑定
if (socket_bind($sock, $address, $port) === false) {
	echo "socket_bind() failed :reason:" . 
socket_strerror(socket_last_error($sock)) . "\n";
}
//监听
if (socket_listen($sock, 5) === false) {
	echo "socket_bind() failed :reason:" . 
socket_strerror(socket_last_error($sock)) . "\n";
}
do {
	//得到一个链接
	if (($msgsock = socket_accept($sock)) === false) {
		echo "socket_accepty() failed :reason:".
socket_strerror(socket_last_error($sock)) . "\n";
		break;
	}
	//welcome  发送到客户端
	$msg = "<font color='red'>server send:welcome</font><br/>";
	socket_write($msgsock, $msg, strlen($msg));
	echo 'read client message\n<br />';
	$buf = socket_read($msgsock, 8192);
	$talkback = "received message:$buf\n<br/>";
	echo $talkback;//在服务端命令行可以看到的此输出
	if (false === socket_write($msgsock, $talkback, strlen($talkback))) {
		echo "socket_write() failed reason:" . 
socket_strerror(socket_last_error($sock)) ."\n";
	} else {
		echo 'send success';//在服务端命令行可以看到的此输出
	}
	socket_close($msgsock);
} while(true);
//关闭socket
socket_close($sock);
?>

client.php客户端文件

<?php
//error_reporting(E_ALL);
echo "<h2>tcp/ip connection </h2>\n";
$service_port = 10005;
$address = '127.0.0.1';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
	echo "socket_create() failed: reason: " .
 socket_strerror(socket_last_error()) . "\n";
} else {
	echo "OK. \n";
}

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if($result === false) {
	echo "socket_connect() failed.\nReason: ($result) " .
 socket_strerror(socket_last_error($socket)) . "\n";
} else {
	echo "OK \n<br/>";
}
//$in = "HEAD / http/1.1\r\n";
//$in .= "HOST: localhost \r\n";
//$in .= "Connection: close\r\n\r\n";
$out = "";
$in ="im server!\r\n";//这是像服务端发送的消息
echo "sending http head request ...";
socket_write($socket, $in, strlen($in));
echo  "OK\n";

echo "Reading response:\n\n<br />";
while ($out = socket_read($socket, 8192)) {
	echo $out;//读取服务器端返回的信息
}
echo "closeing socket..";
socket_close($socket);
echo "ok .\n\n<br/>";

在linux下执行php server.php ,因为这个程序是while死循环,所以你不ctrl+c或者kill,他是一直存在的。

然后直接执行php client.php,或者通过浏览器访问(的放在可访问的域名对应的文件目录下)

然后效果就出来了:

这是服务端(server.php)执行的时候,客户端(client.php)访问后的输出。重复访问,则重复这样的输出。

socket-1.jpg

这是我浏览器访问输出的效果:

socket-2.jpg

在执行client.php的时候,确保server.php的进程存在,否则就报错了。