Сокет чат. Браузер не выводит сообщения

serglt

Анус, ой, Ахтунг
Сокет чат. Браузер не выводит сообщения

Здравствуйте коллеги. Возникли проблемки при написании сокетного чата
Есть сервер чата на сокетах его код (точнее его наметки - тест версия):

<?
// socket_server.php

error_reporting (E_ALL);
set_time_limit (0);

if (($main_sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0)
die ("socket_create() failed: reason: " . socket_strerror ($main_sock));

if (($res = socket_bind ($main_sock, "localhost", 8080)) < 0)
die ( "socket_bind() failed: reason: " . socket_strerror ($res));

if (($res = socket_listen ($main_sock)) < 0)
die ("socket_listen() failed: reason: " . socket_strerror ($res));

$clients = array ();

while (true)
{
$msg = "";
if (($new_sock = socket_accept($main_sock)) < 0)
die ("socket_accept() failed: reason: " . socket_strerror ($new_sock));

$data = socket_read ($new_sock, 2048);

echo "\nOpen socket.. " . $new_sock . "\nSend: " . $data . "\nStr len: " . strlen ($data) . "\n";

if (substr ($data, 0, 4) == "SEND")
{
$msg = substr ($data, 4) . "\n";
socket_close ($new_sock);
echo "Closing socket.. " . $new_sock . "\n";
} else {
$clients [] = $new_sock;
echo "New client!\nClients count: " . count ($clients) . "\n";
}

if (strstr ($msg, "shutdown") !== false)
break;

foreach ($clients as $c)
{
echo "Write message.. " . $c . "\n";
socket_write ($c, $msg, strlen ($msg));
}
}
socket_close ($main_sock);

?>

Ниже HTML главной страницы: chat.php
<html>
<head>
<title>Chat</title>
</head>
<FRAMESET ROWS="*, 50" FRAMESPACING="0" NORESIZE>
<FRAME name="message" SRC="http://localhost:8080/" FRAMESPACING="0" NORESIZE>
<FRAME NAME="keyboard" SRC="keyboard.php?sid=SergLT" FRAMESPACING="0" SCROLLING="NO" NORESIZE>
</FRAMESET>
</html>

Как видим страничка состоит из двух фреймов: главного - куда пишутся сообщения сокетным процессом, и фреймом с формой для отправки сообщений ее исходный код:

<?
//keyboard.php

if (isset ($_POST ['msg']))
{
$h = fsockopen ("localhost", 8080);
fwrite ($h, "SEND [" . date ("H:i") . "]" . $_GET ['sid'] . ": " . $_POST ['msg'] . "<br>\n");
fclose ($h);
}

header ("Content-Type: text/html; charset=windows-1251;");
?>
<html>
<haed></head>
<body>
<form method="post" action="keyboard.php?sid=<?= $_GET ['sid'] ?>">
<input type="hidden" name="q" value="1">
<input name="msg" value="">
<input type="submit" name="send" value="ПАСЛАТЬ">
</form>
</body>
</html>


В общем возникла проблемка: посылаем сообщения на сервак (сообщения посылаются все намана) но когда сервак отсылает их мне обратно в окно главного фрейма - ничего не отображается :(
При отправке сообщения "shutdown" (Как видно из кода сервера - выход из вечного цикла) все сообщения появляются.
В чем может быть дело? Может кто подскажет? Заранее спасибо.
 

white phoenix

Новичок
Не вижу отправки заголовков.
Added: именно в них дело, т.к. сначала в ответе идут заголовке, потом \n\n, а потом содержание, пока ты отправляешь сообщения броузер считает что это всё заголовки идут, а потом когда shutdown броузер смекает что больше данных нет значит это были не заголовки и выводит как html.
 

serglt

Анус, ой, Ахтунг
Ок, я так и подумал во сне сегодня, счас буду пробовать :) Спасибо.

-~{}~ 23.12.05 11:06:

Еще вопросик товарищи, как узнать что коннект у пользователя отвалился? Никто не подскажет?

-~{}~ 23.12.05 11:09:

А на счет заголовков - большое спасибо, вот тока еще оказывается надо отправлять сообщение первое длинное, а то не хочет отображать браузер первые маленькие
 

white phoenix

Новичок
serglt
Еще вопросик товарищи, как узнать что коннект у пользователя отвалился? Никто не подскажет?
По таймауту.
А на счет заголовков - большое спасибо, вот тока еще оказывается надо отправлять сообщение первое длинное, а то не хочет отображать браузер первые маленькие
Да. Сначала посылай, например, "<//-- ".str_repeat('0',1024)." -->", а потом уже всё остальное. Это что-то вроде "затравки".
 

white phoenix

Новичок
serglt
Если втечение отрезка времени в N сек клиент не подавал признаков жизни, значит он отвалился.
 

serglt

Анус, ой, Ахтунг
Да я подумал просто это можно сделать по другому, так как окно браузера тока всасывает данные, а лишний пинг - лишние педали :)
Если есть $msg
$len = @socket_write ($sock, $msg, strlen ($msg));
if ($len == 0)
{
Закрыть конект, сообщить всем что чувак отвалился
}
Может я не прав, поправте :)

-~{}~ 23.12.05 15:38:

Даже не так, а вот так
$len = @socket_write ($sock, $msg, strlen ($msg));
if ($len === false)
...

-~{}~ 23.12.05 16:10:

Со мной все согласны?:)
Через некоторое время отправляем все по пустой строке и если функция возвращает false делаем нужные нам действия.
Я прав или я прав?:)
 
Сверху