我的php客户端有问题。
我能做什么:
1)使用密码
连接到tcp服务器2)从tcp服务器读取字符串
3)将xml字符串从tcp服务器保存到文件一次
4)关闭连接
我想要的是什么:
1)将xml字符串从tcp服务器保存到循环文件 - 大约10秒延迟(永不关闭)
技术信息:
我必须从服务器读取第一个标头响应,例如“Hello stranger”。 将我的传递添加到字符串并将其发送到服务器。 我做得很流利。
来自服务器的TCP流(XML文件)结束char 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做到吗?
答案 0 :(得分: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 concat,使用点,例如:$password.$smystring