#php #sockets
#php #сокеты
Вопрос:
Я пишу простой код сокета php.
Вот мой код
<?php
$address="127.0.0.1";
$port=9875;
echo "I am here";
if(false==($socket= socket_create(AF_INET,SOCK_STREAM, SOL_TCP)))
{
echo "could not create socket";
}
socket_bind($socket, $address, $port) or die ("could not bind socket");
socket_listen($socket);
if(($client=socket_accept($socket)))
echo "client is here";
?>
когда я запускаю эту программу, мой браузер показывает только ожидание localhost.
Есть ли какие-либо проблемы в моем коде?
Я использую xammp 1.7.4 .
Еще одна вещь, которую я хочу знать, если я хочу получить HTTP или FTP-запрос, должен ли я изменить только номер порта?
Комментарии:
1. Пожалуйста, улучшите свой английский, избегайте приветствий и благодарностей и избегайте написания с чрезмерными вопросительными знаками.
2. Пытались закрыть сокет после того, как вы закончили его использовать?
Ответ №1:
Я проверил код и протестировал в своей системе, и он работает правильно. Отображается как «клиент здесь» после запуска клиента.
Имя файла: server.php
<?php
$address="127.0.0.1";
$port=9875;
echo "I am here";
set_time_limit (0);
if(false==($socket= socket_create(AF_INET,SOCK_STREAM, SOL_TCP)))
{
echo "could not create socket";
}
socket_bind($socket, $address, $port) or die ("could not bind socket");
socket_listen($socket);
if(($client=socket_accept($socket)))
echo "client is here";
socket_close($socket);
?>
Сначала запустите server.php файл.
Файл: client.php
<?php
$host="127.0.0.1" ;
$port=9875;
$timeout=30;
$sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;
if (!is_resource($sk)) {
exit("connection fail: ".$errnum." ".$errstr) ;
} else {
echo "Connected";
}
?>
Теперь запустите client.php
Ваш вывод должен быть таким (как у меня в моей системе)
Я здесь, клиент здесь
Если нет, убедитесь, что ваш брандмауэр не блокирует запрос. Временно отключите антивирус, если он у вас есть.
Комментарии:
1. Это работает. Спасибо. Можете ли вы дать мне свой почтовый адрес, чтобы я мог поддерживать с вами контакт? Я новичок в php. Итак, у меня возникла некоторая проблема. Можете ли вы мне помочь?
2. Приятно знать, что это работает. Вы всегда можете опубликовать свои запросы в stackoverflow или связаться со мной в facebook,
Ответ №2:
Это ожидаемое поведение ожидания. Написанная вами программа представляет собой сервер сокетов, который готов прослушивать соединение с указанным портом, до тех пор он будет ждать.
Вы можете создать клиента, который подключается так, что вы увидите ответ «Клиент здесь». Клиентом может быть любой язык программирования, включая PHP.
Ниже приведен пример кода на PHP (я его не проверял).
$fp = stream_socket_client("127.0.0.1:9875", $errno, $errstr);
if (!$fp) {
echo "$errstr ($errno)<br />n";
} else {
// Handle code here for reading/writing
}
Вы можете проверить, есть ли образец клиентского кода на PHP по этой ссылке.
Редактировать
$host = "127.0.0.1";
$port = 9875;
$timeout = 30;
$sk = fsockopen($host, $port, $errnum, $errstr, $timeout);
if (!is_resource($sk)) {
exit("connection fail: " . $errnum . " " . $errstr);
} else {
echo "Connected";
}
Комментарии:
1. Я также пишу клиентский файл. Но он не может достичь сервера. Отображается ошибка «не удалось подключиться к 127.0.0.1: 9875 (Не удалось установить соединение, поскольку целевая машина активно отказалась от него».
2. вы запускаете другую страницу в качестве клиента? убедитесь, что вы сначала запустили сервер. Можете ли вы попробовать отредактированный код в моем ответе
3. Я запускаю другую страницу в качестве клиента, также сначала запускаю сервер и пробую ваш код. Но все та же ошибка.