PHP TCP客户端监听器

3

我有一个关于php客户端的问题。

我可以做到以下几点:

1) 使用密码连接到tcp服务器

2) 从tcp服务器读取字符串

3) 将tcp服务器的xml字符串保存到文件中一次

4) 关闭连接

我想要的是:

1) 在循环中将tcp服务器的xml字符串保存到文件中 - 大约10秒的延迟(永不关闭)

技术信息:

我必须首先从服务器读取第一个头响应,例如“Hello stranger”。 将我的密码添加到字符串中并将其发送到服务器。 我已经顺利完成了这个过程。

TCP流(XML文件)从服务器结束字符为NULL(0x00)

我的代码:

<?php
$cfgPort    = "666";     //that's not my port, server and pass :-D           
$cfgTimeOut = "5";
$cfgServer ="myserver.pl";
$password = "donald";
$socket =fsockopen("$cfgServer",$cfgPort,$cfgTimeOut);
if (!$socket)
{
echo "Not conn\r\n";
}
else
{
echo "Conn!\r\n";
        $key = fread($socket, 81);
    //$key = fgets($socket, 82);

//what should I use fread or fgets ???

        $key_password = $key.$password;
// log in
        fwrite($socket, $key_password."\r\n");

//I checked response from server

        echo fread($socket, 18);

        //if authorized
        //body response 

        $his = fread($socket, 2048);
        $xml_clear = substr($his, 1, -1);
        $file = 'xml.xml';
        file_put_contents($file, $xml_clear);       
fclose($socket);
}
echo "The end!\r\n";
?>

下一个问题:

我必须使用CRON来做吗?

在telnet中,我可以发送头数据包(密码),然后等待响应以保持连接。我能在PHP中做到吗?


如果您有cPanel,使用CRON非常简单,只需将该代码每10分钟运行一次即可。 - odedta
我知道这一点,但我正在寻求帮助,以便不必每次都发送头部(密码)。 - Przemysław Mrączek
你想做的就是从URL获取一个字符串并将其保存在XML文件中吗?如果是这种情况,请使用cURL:http://www.electrictoolbox.com/php-curl-sending-username-password/ - odedta
在这一步 - 是的。 我知道这是一个简单的过程,但我在这个地方犯了错误。 - Przemysław Mrączek
1个回答

0

你可以使用cURL获取文件,并从中提取字符串,方法如下:

pre {
  font-family: monospace, monospace;
  font-size: 1em;
  overflow: auto;
  border: 1px solid #999;
  page-break-inside: avoid;
  display: block;
  padding: 9.5px;
  margin: 0 0 10px;
  font-size: 13px;
  line-height: 1.42857143;
  color: #333;
  word-break: break-all;
  word-wrap: break-word;
  background-color: #f5f5f5;
  border: 1px solid #ccc;
  border-radius: 4px;
 }
<pre>
<?php
 $username='donald';
 $password='donald';
 $url='http://odedta.com/projects/tests/test.php';

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
 $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code
 $response=curl_exec($ch);
 curl_close($ch);
 var_dump($result);
?>
</pre>

结果是转储xml内容。一旦您完成对字符串/文件的所有修改,您可以使用file_put_contents(),然后运行CRON作业每10分钟运行该文件。

这是每10分钟运行该文件的CRON命令:
php -f /home/yourusername/public_html/path/to/project/test.php

修订1:
如果您想获取标题:

curl_setopt($ch, CURLOPT_HEADER, true);

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

修订版2:
如果您想向服务器发送信息,可以使用此示例脚本:

//set POST variables
$url = 'http://domain.com/get-post.php';
$fields = array(
                        'lname' => urlencode($last_name),
                        'fname' => urlencode($first_name),
                        'title' => urlencode($title),
                        'company' => urlencode($institution),
                        'age' => urlencode($age),
                        'email' => urlencode($email),
                        'phone' => urlencode($phone)
                );

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

$fields 是一个变量或字符串(在您的情况下)数组,你希望发送到服务器。

至于将密码添加到字符串或其他内容中,只需使用 PHP 的连接运算符 dot ,例如:$password.$smystring


太好了!但是,“我必须先从服务器读取第一个头响应,例如“你好陌生人”。将我的密码添加到字符串中并发送到服务器。”怎么样? - Przemysław Mrączek
请查看我的修订答案。如果这回答了你的问题,请接受它作为答案。 - odedta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接