PHP通过socket传二进制图片流保存到本地

时间:2024-03-19 10:05:15

利用socket传图片,可以在局域网内通过客户端向服务端发送图片,同样的也可以互相传输一些数据。代码如下:

客户端代码:client.php

/* client.php */

<?php
$filePath = "E:\\PHP\\image\\";         //设置图片所在的路径
$fileName =  "jjj.jpg";                 //要上传的图片
$fp = fsockopen("127.0.0.1", 1500, $errno, $errstr, 30);    //创建一个网络套接字,ip地址以及端口号要与服务器ip及端口号一致
if (is_resource($fp)) {
    $fileSize = filesize($filePath . $fileName);        //检查文件大小
    $out = file_get_contents($filePath . $fileName);            //把要发送的图片转成二进制图片流
    $receiveFileSize = fwrite($fp, $out);                               //发送文件
    echo 'send success';
} else {
    echo 'data uncomplete!';
}
fclose($fp);            //关闭文件

服务端代码:server.php

/* server.php */

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);         //创建套接字
socket_bind($socket, '127.0.0.1', 1500);             //绑定ip地址和端口号
socket_listen($socket);     //监听端口  

//初始化一个数据,和客户端通信  
$buffer = "connent";
while (true) {
    $connection = socket_accept($socket);       //接收套接字的信息
    if (!$connection){
        echo "connent fail";
    }else{
        echo "Socket connent\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" ;
        }
        $datas = "";        //初始化数据
        while ($flag = @socket_recv($connection, $data, 15360, 0)){         //socket_recv()函数,从$connection里读取数据信息,存入$data
            $datas = $datas.$data;          //数据叠加
                }
                print_r(strlen($datas)).PHP_EOL;        //打印数据大小
                date_default_timezone_set('Asia/Shanghai');         //设置时区
                $name = date('YmdHis',time());      //以时间为文件名
                file_put_contents("$name.jpg", $datas);         //该函数解析二进制数据
        }
        socket_close($connection);     //  关闭套接字
}
?>

代码就编写完成了。之后就是运行代码了。

用cmd命令窗口运行代码

PHP通过socket传二进制图片流保存到本地

客户端运行

PHP通过socket传二进制图片流保存到本地

服务端结果

PHP通过socket传二进制图片流保存到本地

然后文件就存下来了

PHP通过socket传二进制图片流保存到本地

那些在命令窗口说php不是内部命令的,是因为在环境变量中没有设置。设置php环境变量的方法可以去百度一下,有很多的方法的。