עבור לתוכן

קבלת מידע שוטף מסוקט, PHP

Featured Replies

פורסם

שלום,

יש לי תוכנה שמאזינה על פורט מסויים וברגע שמישהו שולח לה את המילה "get", היא שולחת בחזרה כל מספר שניות שורה שונה.

אני רוצה לכתוב עמוד PHP שמתחבר לאייפי והפורט, שולח "get" ומקבל ברגע שהתוכנה שולחת לו את השורות ומדפיסה אותם בecho

כתבתי את הקוד הזה:


<?php

$host = 'ip';
$port = port;

$conn = @fsockopen($host, $port, $errno, $errstr, 30);
if (!$conn) { die("Error: ".$errstr); }
fwrite($conn, "get\n");
while (!feof($conn)) {
usleep(100);
$theNewData .= fgets($conn);
echo $theNewData;
}
fclose($conn);


?>

אבל זה לא עובד, רק טוען את הדף בלי להפסיק..

שאני שולח רק את הפקודה

 echo fread($conn, 27); 

בלי הלולאה, אני מקבל את מה שהתוכנה מחזירה, אבל רק מה שהיא מחזירה באותו רגע..

למישהו יש פתרון?

פורסם

אני מניח שאתה מריץ את הקוד הזה מתוך עמוד HTTP ולא מתוך שורת פקודה (פרטים שוליים)...

בעיקרון נסה להוסיף flush() וגם ob_flush() אם זה לא מספיק, אחרי ה echo.

אם הצד השני לא סוגר את הסוקט, אז feof לא יסתיים אף פעם ולכן טעינת העמוד לא תסתיים אף פעם.

פורסם
  • מחבר

לא עבד.. עדיין טוען בלי להפסיק.

פורסם

לא עובד מה... מה עשית בדיוק..

פורסם
  • מחבר

הוספתי מה שאמרת לי..



<?php

$host = '212.143.xx.xx';
$port = xxxx;

$conn = @fsockopen($host, $port, $errno, $errstr, 30);
if (!$conn) { die("Error: ".$errstr); }
fwrite($conn, "get\n");
while (!feof($conn)) {
usleep(100);
$theNewData = '';
$theNewData .= fgets($conn);
echo $theNewData;
flush();
ob_flush();
}
fclose($conn);


?>

פורסם

זה לא מראה כלום באמצע ? בכל מקרה, זה אף פעם לא יפסיק לטעון את העמוד גם ככה, אז למה פשוט לא להחליט לפי איזה תנאי להפסיק את הלולאה האינסופית הזו ולסיים את העמוד ?

פורסם
  • מחבר

כי התוכנה שולחת שורות כל כמה שניות, אני רוצה שהדף ידפיס אותם..

זה כמו instant chat כזה.. לא נגמר

פורסם

טוב... אז מה אתה רוצה, זה לא נגמר, זה לא יסגר, האם לפחות אחרי ה flush אתה רואה את המידע ?

פורסם
  • מחבר

לא, זה פשוט טוען בלי להפסיק.

איך בנוי למשל צ'אט פשוט בPHP?

הוא מתחבר לאייפי אחר ומקבל ממנו מידע שוטף, בלי להפסיק..

איך עושים דבר כזה, שיתחבר ויקבל מידע כל פעם שהשרת שולח לו?

פורסם

בצורה שפויה עושים את זה ע"י הרצת קוד javascript שמשתמש ב xmlhttprequest ברקע. בצורה כזו העמוד נטען מהר ואז יש 2 אופציות, או שאחת לכמה זמן ה javascript יתחבר לשרת וישאל אותו מה חדש מאז הפעם האחרונה (קצת יותר קשה לממש בצורה לוגית אבל מה שבד"כ עושים) או שיש טכנולוגיה בשם comet שבה יש חיבור מתמיד ברקע והשרת יכול לדחוף ללקוח כל מני הודעות:

http://en.wikipedia.org/wiki/Ajax_(programming)

http://en.wikipedia.org/wiki/Comet_(programming)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים