2016-07-23 9 views
0

Ich benutze PHP als Server auf localhost. Ich benutze Python als Client.Wie schreibe ich Server für Chat-Programm in PHP mit Socket

Ich möchte das: Client wird Nachricht an den Server senden. Server sendet die gleiche Nachricht an Clients. Und alle Clients zeigen die Nachricht, die gesendet wird. Aber wenn ich 2 Clients öffne, können die Clients keine Antwort vom Server erhalten, wenn sie eine Nachricht senden.

Wie kann ich einen Server mit PHP schreiben, der richtig funktioniert? Irgendeine Idee?

server.php:

<?php 

    error_reporting(E_ALL); 

    set_time_limit(0); 

    header("Content-Type: text/plain; charset=UTF-8"); 

    define("HOST", "127.0.0.1"); 

    define("PORT", 28028); 
a:  
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
    $result = socket_bind($socket, HOST, PORT) or die("Could not bind to socket\n"); 
    $result = socket_listen($socket, 50) or die("Could not set up socket listener\n"); 

    $error = 0; 
    while (true){ 
     $error = 0; 
     $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
     $input = socket_read($spawn, 1024); 
     if (!$input) { 
      $error = 1; 
     } 


     if (socket_write($spawn, $input, strlen($input)) === false){ 
      $error = 1; 
     } 

     if ($error){ 
      goto a; 
     } 



    } 
    socket_close($spawn); 

    socket_close($socket); 

client.py:

from socket import * 
from threading import Thread 
import sys 

HOST = 'localhost' 
PORT = 28028 
BUFSIZE = 1024 
ADDR = (HOST, PORT) 

tcpCliSock = socket(AF_INET, SOCK_STREAM) 
tcpCliSock.connect(ADDR) 

def recv(): 
    while True: 
     data = tcpCliSock.recv(BUFSIZE) 
     if not data: sys.exit(0) 
     print data 

Thread(target=recv).start() 
while True: 
    data = raw_input('> ') 
    if not data: break 
    tcpCliSock.send(data) 

tcpCliSock.close() 

Antwort

0

Der Server gleichzeitig für Verbindungen und Daten von den Clients warten aufweist; Dies ist einfach mit socket_select(). Ersetzen Sie Ihre while (true){…} Schleife mit

$s = array($socket); // initially wait for connections 
    while ($r = $s and socket_select($r, $n=NULL, $n=NULL, NULL)) 
    foreach ($r as $stream) 
    if ($stream == $socket) // new client 
     $s[] = socket_accept($socket);    // add it to $s (index 1 on) 
    else     // data from a client 
     if ($input = socket_read($stream, 1024)) 
      foreach (array_slice($s, 1) as $client) // clients from index 1 on 
       socket_write($client, $input, strlen($input)); 
     else 
     { 
      close($stream); 
      array_splice($s, array_search($stream, $s), 1); // remove client 
     } 

Hier ist der Server-Socket und die Client-Sockets sind in dem Array $s gespeichert.