php socket聊天示例代码
php socket聊天示例代码.。闲来无事,随便写写代码练练手,想搞个socket聊天的小程序,收货也不小,懂得了些东西。
socket_server.php<?php
class SocketServer
{
private $ip;
private $port;
private $socket;
public function __construct($ip = '127.0.0.1', $port = '9999')
{
$this->ip = $ip;
$this->port = $port;
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
$tcp = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);
if (!$socket) {
die('Unable to create AF_INET socket');
}
@socket_bind($socket, $ip, $port) or die('socket bind failed' . PHP_EOL);
@socket_listen($socket, 1) or die('socket listen failed' . PHP_EOL);
echo 'Server start...' . PHP_EOL;
$this->socket = socket_accept($socket);
}
public function run()
{
while (true) {
$this->sendMsg($this->socket);
echo $this->readMsg($this->socket) . PHP_EOL;
sleep(3);
}
socket_close($this->socket);
}
public function sendMsg($socket)
{
// $handle = fopen("php://stdin", "r");
// $input = fgets($handle);
$input = 'Server send msg to Client: ' . date('Y年m月d日 H时i分s秒', time());
socket_write($socket, $input);
}
public function readMsg($socket)
{
return socket_read($socket, 1024);
}
}
$server = new SocketServer();
$server->run();
socket_client.php<?php
class SocketClient
{
private $ip;
private $port;
private $socket;
public function __construct($ip = '127.0.0.1', $port = '9999')
{
$this->ip = $ip;
$this->port = $port;
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
$tcp = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);
if (!$socket) {
die('Unable to create AF_INET socket');
}
@socket_connect($socket, $this->ip, $this->port) or die(PHP_EOL . 'connect to server faild!' . PHP_EOL);
$this->socket = $socket;
echo 'Connect success' . PHP_EOL;
}
public function run()
{
while (true) {
echo $this->readMsg($this->socket) . PHP_EOL;
$this->sendMsg($this->socket);
sleep(3);
}
socket_close($this->socket);
}
public function sendMsg($socket)
{
// $handle = fopen("php://stdin", "r");
// $input = fgets($handle);
$input = 'Client send msg to Server: ' . date('Y-m-d H:i:s', time());
socket_write($socket, $input);
}
public function readMsg($socket)
{
return socket_read($socket, 1024);
}
}
$client = new SocketClient();
$client->run();
最终实现的效果是,客户端和服务端能互通消息,但不够强大。存在很多问题,例如不能一次性发多条信息给对方,对方自然也不能一次性收多条消息,还有不能解决命令行输入阻塞的问题,所以注释了
// $handle = fopen("php://stdin", "r");
// $input = fgets($handle);
看来用原生的php写一个聊天小程序还要遇到很多问题需要解决,要想快速的完成得借助workerman或者swoole这样的框架了。