2014-12-10 3 views
1

Я разрабатываю свое первое приложение на PHP с помощью Curl. Целью этого приложения является разработка HTTP-клиента, который отправляет данные на сервер.отправить http-запросы в том же сеансе с curl

Сервер прослушивает порт 10000 по адресу: 192.168.1.110.

Это код сервера:

<?php 
error_reporting(E_ALL); 
set_time_limit(0); 
ob_implicit_flush(); 

$address = '192.168.1.110'; 
$port = 10000; 

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { 
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n"; 
} 

if (socket_bind($sock, $address, $port) === false) { 
    echo "socket_bind() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

if (socket_listen($sock, 5) === false) { 
    echo "socket_listen() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n"; 
} 

//clients array 
$clients = array(); 

do { 
    $read = array(); 
    $read[] = $sock; 
    $write = NULL; 
    $except = NULL; 

    $read = array_merge($read,$clients); 

    // Set up a blocking call to socket_select 
    if(socket_select($read,$write, $except, $tv_sec = 5) < 1) 
    { 
     continue; 
    } 

    // Handle new Connections 
    if (in_array($sock, $read)) {  

     if (($msgsock = socket_accept($sock)) === false) { 
      echo "socket_accept() fail: " . socket_strerror(socket_last_error($sock)) . "\n"; 
      break; 
     } 
     $clients[] = $msgsock; 
     $key = array_keys($clients, $msgsock); 
     /* Enviar instrucciones. */ 
     $msg = "HTTP/1.1 100 Continue \n"; 
     socket_write($msgsock, $msg, strlen($msg)); 

    } 

    // Handle Input 
    foreach ($clients as $key => $client) { // for each client  
     if (in_array($client, $read)) { 
      if (false === ($buf = socket_read($client, 4096))) { 
       echo "socket_read() falló: razón: " . socket_strerror(socket_last_error($client)) . "\n"; 
       break 2; 
      } 
      if (!$buf = trim($buf)) { 
       continue; 
      } 
      echo "$buf\n"; 

      $talkback = "Client {$key}: msg '$buf'.\n"; 
      socket_write($client, $talkback, strlen($talkback)); 
      //echo "$buf\n"; 
     } 

    } 
} while (true); 

socket_close($sock); 

И это исходный код HTTP клиента:

<?php 
$url = 'http://192.168.1.110:10000'; 
$fields_string = "A"; 
$fields = array(
    'SERIAL_NUMBER ' => urlencode('123456'), 
    'HARDWARE_ID ' => urlencode('455FFG'), 
    'CODE ' => urlencode('99'), 
    //field goes here 
       ); 

foreach($fields as $key=>$value) { 
    $fields_string .= $key.'='.$value.'&'; 
} 
rtrim($fields_string, '&'); 



$ch = curl_init("http://192.168.1.110:10000"); 
curl_setopt($ch,CURLOPT_POST, count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 
crl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);                  
$output = curl_exec($ch); 
echo $output; 
curl_setopt($ch,CURLOPT_POSTFIELDS,'test second session !!!!!'); 
$output = curl_exec($ch); 
echo $output; 
curl_close($ch); 

Когда я исполню это приложение (клиент/сервер), я получил этот результат:

HTTP/1.1 100 Continue 
Client 16: msg 'POST/HTTP/1.1 
Host: 192.168.1.110:10000 
Accept: */* 
Content-Length: 52 
Content-Type: application/x-www-form-urlencoded 

ASERIAL_NUMBER =123456&HARDWARE_ID =455FFG&CODE =99&1HTTP/1.1 100 Continue 
Client 17: msg 'POST/HTTP/1.1 
Host: 192.168.1.110:10000 
Accept: */* 
Content-Length: 25 
Content-Type: application/x-www-form-urlencoded 

test second session !!!!! 

Проблема заключается в том, что клиент HTTP не отправляет данные в тот же сеанс, клиентский номер был увеличен [Client 16, Client 17] !!

Как отправить данные в тот же сеанс с помощью Curl?

ответ

0

Сеанс сохраняется в куки браузера:

Browser cookie

Когда вы делаете скручивание запрос на стороне сервера (например, в вашем PHP кода), что куки не тиражируется.

Что вам нужно сделать, так это сказать Curl включить заголовок файла cookie. Вы получаете текущий файл cookie из массива $_COOKIE и помещаете его в заголовки, которые вы отправляете вместе с запросом Curl.

$headers = array(); 

// Add cookies to headers, if they're present 
if( isset($_COOKIE)  === true 
    && is_array($_COOKIE) === true 
    && sizeof($_COOKIE) > 0 
) { 
    $cookie_header = "Cookie:"; 

    // Concatenate each cookie key and value like "key=value" 
    foreach($_COOKIE as $k=>$v) { 
     $cookie_header .= " ".safestring($k)."=".safestring($v).";"; 
    } 

    $headers[] = $cookie_header; 
} 

// Add headers to request, if they're present 
if(sizeof($headers) > 0) { 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
} 
+0

Я добавляю этот код в http-клиент, но та же проблема сохраняется –

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