PHP能夠打開遠程或者本地服務器的sockets!這裡是一個使用socket的簡單的例子:連接到Usenet的新聞服務器,與服務器溝通,並從一個精確的新聞分組中下載一些文章。
使用PHP打開Socket
使用fsockopen()來打開一個Socket。這個函數在PHP3和PHP4中都存在。函數的原型如下:
<?php
intfsockopen
(string hostname,
int port[,
int errno[,
string errstr[,
double timeout]]])
?>
對於網絡主機,它將建立一個TCP的Socket的連接到主機名的端口上。主機名可以是域名或者IP地址。對於UDP連接,你需要明確指出其協議:udp://hostname。對於unix主機,主機名將在socket的路徑中使用,在這個例子中端口必須設置成0。可選項timeout可以用來設置連接超時的秒數。
關於fsockopen()的更多信息可以訪問http://www.php.net/manual/function.fsockopen.php
網絡新聞傳輸協議(NNTP)
訪問一個usenet新聞服務器需要用到一個特別的協議,稱作NNTP,即網絡新聞傳輸協議標准。這個協議的詳細資料在RFC977中,你可以在http://www.w3.org/Protocols/rfc977/rfc977.html中查看到。這個文檔詳細的描述了如何使用不同的命令來連接並且和NNTP服務器對話。
連接服務器
連接到NNTP服務器需要知道服務器的主機名(或者IP地址)和它將要監聽的端口。另外建議你加上一個超時的時間,這樣連接失敗的時候就不會“凍結”程序。
<?php
$cfgServer ="your.news.host";
$cfgPort =119;
$cfgTimeOut =10;
// open asocket
if(!$cfgTimeOut)
// without timeout
$usenet_handle=fsockopen($cfgServer,$cfgPort);
else
// with timeout
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
if(!$usenet_handle) {
echo"Connexionfailed\n";
exit();
}
else {
echo"Connected\n";
$tmp=fgets($usenet_handle,1024);
}
?>
與服務器交互
現在我們已經連接上服務器了,而且能夠通過先前打開的socket連接與服務器進行交互。讓我們對服務器說“我們要從某一新聞分組中獲取到最新的10篇文章”。RFC977定義了如何選擇正確的新聞分組的命令,如下:
GROUPggg
必需的參數ggg是你將要選擇的新聞分組的名字,比如net.news。使用list命令你可以獲取到一組有效的新聞列表。成功選擇響應會返回組中首尾兩篇新聞的新聞號以及對存檔新聞號估計。
比如
chrome:~$ telnetmy.news.host 119
Trying aa.bb.cc.dd...
Connected tomy.news.host.
Escape character is'^]'.
200 my.news.hostInterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok).
GROUP alt.test
211 232 222996 223235alt.test
quit
205 .