一,利用fsockopen来上传文件
以前我写过一篇关于socket通信原理的博文http://blog.51yip.com/php/673.html有兴趣的朋友可以看看,前面讲的那篇博文,socket的服务器和客户端都是要用php命令来运行的。平常我们上传文件是浏览本地文件,通过一个php程序将文件上传一个地方,这个时候我们用php命令来运行php程序就不方便了。这个时候我们可以用fsockopen来打开一个socket通道,并且可以通过浏览器来访问页面。下面有一个例子,大家可以试一下。
二,upload.html
<html> <body> <form action='image.php' method='post' name='form' enctype='multipart/form-data'> <input type='file' name='photo'> <input type=submit value='submit'> </form> </body> </html>
浏览本地文件上传到中间文件image.php
三,image.php来向socket传送数据
<?php $fp = fsockopen("127.0.0.1", 10008, $errno, $errstr, 10); $array = $_FILES['photo']; if(!$fp){ echo "open fail"; }else{ if(!empty($array)){ $str= 'filename:'.$array['name']; fwrite($fp,$str); $filename = $array['tmp_name']; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fwrite($fp,$contents); } echo $fp; } fclose($fp); ?>
他的作用是和SOCKET服务器,建立通信,将数据输送到socket通道中
四,server.php接收到数据
<?php // 建立server端socket $tcp = getprotobyname("tcp"); $socket = socket_create(AF_INET, SOCK_STREAM, $tcp); socket_bind($socket, '127.0.0.1', 10008); //绑定要监听的端口 socket_listen($socket); //监听端口 //初始化一个数据,和客户端通信 $buffer = "connect"; $path = "/home/zhangy/www/test/"; while (true) { // 接受一个socket连接 $connection = socket_accept($socket); if(!$connection){ echo "connect fail"; }else{ echo "Socket connected\n"; // 向客户端传递一个信息数据 if ($buffer != "") { echo "send data to client\n"; socket_write($connection, $buffer . "\n"); echo "Wrote to socket\n"; } else { echo "no data in the buffer\n" ; } //从客户端取得数据 while($flag = @socket_recv($connection, $data, 2048, 0)){ if (false !== strpos($data,'filename:')){ $filename = substr($data,9); $filename = $path.$filename; //根据传过来的名子打开一个文件 $fp = fopen($filename,"wb"); continue; } fwrite($fp,$data); } fclose($fp); } socket_close($connection); //关闭 socket printf("Closed the socket\n"); } ?>
他的作用是接收数据,并将数据存储存起来
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/686.html
总结的不错,力挺一下。。
谢谢你的分享,但是根据你这个例子,穿的图片不完整,图片下半截是灰色的,不知道是什么情况?
image.php 这行少个 "\n\r"
$filename .= "\n\r";
$handle = fopen($filename, "r");
留言不能编辑了。
貌似不加 "\n\r" 也可以的。
:_)