2016-12-15 2 views
0

Я пытаюсь отправить данные непрерывно из клиентского сокета python в сокет php-сервера, я смог отправить данные один раз и распечатать его. Но если я помещу сервер в цикл while, чтобы продолжать слушать, данные, которые он получает, больше не распечатываются. Он по-прежнему отвечает клиенту, если я верну ему что-то.Ячейка сервера Php, получающая непрерывные данные из клиентского сокета python

клиентский код Python (это будет введен в функцию, которая вызывается каждый раз, когда я отправить что-то):

import socket 
import sys 

def main(): 
    host = 'localhost' 
    port = 5003 # The same port as used by the server 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print >> sys.stderr, 'connecting to %s port %s' % (host, port) 
    s.connect((host, port)) 
    s.sendall("Hello! Heartbeat 40!") 
    data = s.recv(1024) 
    s.close() 
    print('Received', repr(data)) 
if __name__ == "__main__": 
    main() 

код сервера Php:

<!DOCTYPE html> 
<html> 
<body> 

<?php 

// set some variables 
$host = "127.0.0.1"; 
$port = 5003; 
// don't timeout! 
set_time_limit(0); 
// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
// start listening for connections 
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 


while(true){ 
    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 
    // clean up input string 
    $input = trim($input); 
    echo "Client Message : ".$input; 
    // socket_close($spawn); 
} 
socket_close($socket); 



?> 

</body> 
</html> 

ответ

1

PHP выход не является отправить браузер сразу. Сервер Httpd ожидает завершения php-скрипта, а затем отправляет весь результат клиенту.

while(true){ в вашем php-скрипте работает неопределенно, пока не умирает на socket_accept, socket_read, или таймаутом.

Вам необходимо определить точку выхода в вашем цикле, чтобы в конечном итоге остановить сценарий и отправить данные в браузер.

+0

Blew О, я сейчас понимаю. Но я пытаюсь отправить сердцебиение на сервер, который я хочу обновлять на экране каждый раз, когда я его отправляю. Это можно сделать с помощью сокетов? – user3801533

+0

Конечно, но это не тривиально в PHP, так как у вас есть промежуточный веб-сервер. Я wold рекомендую что-то javascriptish как http://socket.io. Единственное, что вам нужно, это понять его ограничения. Другой вариант - использовать периодические тяги. В любом случае вам нужно ajax js на clientide, чтобы постоянно обновлять страницу без перезагрузки. –

Смежные вопросы