php socket客户端和服务端互相通讯实例

 更新时间:2016年11月25日 15:41  点击:1585
php socket是一个什么东西我就不介绍了,下面来给大家整理了一些关于php socket的实现的客户端与服务端互相通讯的例子。

服务端

 代码如下 复制代码

<?php
    set_time_limit(0);
    $host="localhost";
    $port=1001;
     
    //创建一个连接
    $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socketn");
    //绑定socket到端口
    $result=socket_bind($socket,$host,$port) or die("cannot bind port to socketn");
    //开始监听这个端口
    $result=socket_listen($socket,4) or die("could not set up socket listenn");
    //接受连接,另一个socket来处理通信
    $msgsock=socket_accept($socket) or die("cannot accept incoming connectionn");
    if($msgsock){
        echo date("Y-m-d H:i:s D a");
    }
    //读取客户端发送过来的信息
    $input=socket_read($msgsock,1024) or die("cannot read inputn");
    $input=trim($input);
    $output=strrev($input)."顺序反过来了吧n";
    //对接收到的信息进行处理,然后返回到客户端
    socket_write($msgsock,$output,strlen($output)) or die("cannot write");
    //关闭socket连接
    socket_close($msgsock);
    socket_close($socket);
 
?>

客户端

 代码如下 复制代码

<?php
    set_time_limit(0);
    $host="localhost";
    $port=1001;
     
    //创建一个socket
    $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socketn");
     
    $conn=socket_connect($socket,$host,$port) or die("cannot connect servern");
     
    if($conn){echo "client connect ok!";}
     
    socket_write($socket,"hello world!") or die("cannot write datan");
     
    $buffer=socket_read($socket,1024,PHP_NORMAL_READ);
     
    if($buffer){
        echo "response was:".$buffer."n";
    }          
    socket_close($socket);
?>

注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意。 在网站建设过程中,需要处理图片的地方多不胜数,用PHP的图片函数处理图片,十分繁琐。而且对新手来讲十分不好掌握。现在我们可以用PHPThumb类库来处理图片,包括,图片尺寸调整,图片截取,图片加水印,图片旋转等等功能

使用演示:

 代码如下 复制代码

//加载类库文件
require_once 'path/to/ThumbLib.inc.php';

//实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址
$thumb = PhpThumbFactory::create('http://www.111cn.net/');

//把图片等比缩小到最大宽度 100px或者最高100px,当只输入一个参数的时候,是限制最宽的尺寸。
$thumb->resize(100, 100);

//把图片等比缩小到原来的百分数,比如50就是原来的50%。
$thumb->resizePercent(50);

//截取一个175px * 175px的图片,注意这个是截取,超出的部分直接裁切掉,不是强制改变尺寸。
$thumb->adaptiveResize(175, 175);

//从图片的中心计算,截取200px * 100px的图片。
$thumb->cropFromCenter(200, 100);

//截图,前两个参数分别是需要解出的图片的右上角的坐标X,Y。 后面两个参数是需要解出的图片宽,高。
$thumb->crop(100, 100, 300, 200);

//把图片顺时针反转180度
$thumb->rotateImageNDegrees(180);

//保存(生成)图片,你可以保存其他格式,详细参考文档
$thumb->save( 'NewPath/Of/image.jpg ' );

这个类库还有更多功能就不多做介绍了,如果你也在开发PHP网站过程中需要处理图片不妨阅读一下这个类库的文档,保证你处理图片很简单,再也不用和那十几个烦人的php图片处理函数打交道了!
 
 
 
另外一个强大的PHP图片缩略图类:phpThumb
该类除了缩放图片外,还能将图片转换成不同的格式输出(比如将GIF格式的图片输出为PNG格式),其特色功能还包括色彩、特效等
官方网址:http://phpthumb.sourceforge.net/
We’ll be using phpThumb , the open source PHP script to generate thumbnails on the fly.
Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

 代码如下 复制代码
<img src=”phpThumb.php?src=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” />
Adjust the path to phpThumb according to where you place the phpThumb files.
<html>
<head>
</head>
<body>
    <img src="phpThumb/phpThumb.php?src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC" alt="">
</body> 
</html>

 
一般只需要下面的文件就可以了
其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:
src:目标图片的地址
w:输出图片的宽度
h:输出图片的高度(如果不指定他将按w参数等比缩放)
q:输出如果是JPG格式的,可以规定它的输出质量
bg:输出时的背景(如果需要)
sw、sh、sx、sy:局部输出,宽高、起始位置
f:输出格式,可以为jpeg、png、gif、ico
sfn:输出gif动画中的某一帧
fltr[]:滤镜,可以有很多效果,包括锐化、模糊、旋翻转、水印、边框、遮照、色彩调整等

在php中有很多种方法可以实现模拟提交的,下面我整理了四种post提交数据的例子,希望对各位同学会带来帮助。
 代码如下 复制代码

<?php
 
//以程序登陆一个论坛登录为例
function bbslogin($user_login, $password, $host, $port = "80") {
    //需要提交的post数据
    $argv = array('cookie' => array('user_login' => $user_login, 'password' => $password, '_wp_http_referer' => '/bbpress/', 're' => '', 'remember' => true));
    foreach ($argv['cookie'] as $key => $value) {
        $params[] = $key . '=' . $value;
    }
    $params = implode('&', $params);
    $header = "POST /bbpress/bb-login.php HTTP/1.1rn";
    $header .= "Host:$host:$portrn";
    $header .= "Content-Type: application/x-www-form-urlencodedrn";
    $header .= "Content-Length: " . strlen($params) . "rn";
    $header .= "Connection: Closernrn";
    $header .= $params;
    $fp = fsockopen($host, $port);
    fputs($fp, $header);
    while (!feof($fp)) {
        $str = fgets($fp);
        //以下是自己的逻辑代码,这里主要是模拟cookie,可用来同步登陆
        if (!(strpos($str, "Set-Cookie:") === false)) {
            $tmparray = explode(" ", $str);
            $cookiearray = explode("=", $tmparray[1]);
            $cookiepaths = explode("=", $tmparray[6]);
            $cookiename = urldecode($cookiearray[0]);
            $cookievalue = urldecode(substr($cookiearray[1], 0, strlen($cookiearray[1]) - 1));
            $cookietime = time() + 3600 * 24 * 7;
            $cookiepath = urldecode(substr($cookiepaths[1], 0, strlen($cookiepaths[1]) - 1));
            setcookie($cookiename, $cookievalue, $cookietime, $cookiepath);
        }
    }
    fclose($fp);
}
?>
 
 
<?php
// PHP POST数据的三种方法
// php有三种方法可以post数据,分别为Curl、socket、file_get_contents:
 
 
/**
 * Socket版本
 * 使用方法:
 * $post_string = "app=socket&version=beta";
 * request_by_socket('facebook.cn','/restServer.php',$post_string);
 */
function request_by_socket($remote_server, $remote_path, $post_string, $port = 80, $timeout = 30)
{
    $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
    if (!$socket) die("$errstr($errno)");
 
    fwrite($socket, "POST $remote_path HTTP/1.0rn");
    fwrite($socket, "User-Agent: Socket Examplern");
    fwrite($socket, "HOST: $remote_serverrn");
    fwrite($socket, "Content-type: application/x-www-form-urlencodedrn");
    fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . 'rn');
    fwrite($socket, "Accept:*/*rn");
    fwrite($socket, "rn");
    fwrite($socket, "mypost=$post_stringrn");
    fwrite($socket, "rn");
    $header = "";
    while ($str = trim(fgets($socket, 4096))) {
        $header .= $str;
    }
    $data = "";
    while (!feof($socket)) {
        $data .= fgets($socket, 4096);
    }
    return $data;
}
 
 
 
/**
 * Curl版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_curl('http://facebook.cn/restServer.php',$post_string);
 */
function request_by_curl($remote_server, $post_string)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $remote_server);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Jimmy's CURL Example beta");
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
 
 
/**
 * 其它版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_other('http://facebook.cn/restServer.php',$post_string);
 */
function request_by_other($remote_server, $post_string)
{
    $context = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded' .
                        'rn'.'User-Agent : Jimmy's POST Example beta' .
                        'rn'.'Content-length:' . strlen($post_string) + 8,
            'content' => 'mypost=' . $post_string)
        );
    $stream_context = stream_context_create($context);
    $data = file_get_contents($remote_server, false, $stream_context);
    return $data;
}
 
?>
下面给大家整理了个php上传cvs文件完整例子,希望此例子对各位同学会有所帮助自己没注意看不知道什么原因要上传csv文件哦。

html代码:

 代码如下 复制代码

<form action="/message/index/csv" encType="multipart/form-data" method="post" target="uploadcvs">
<div><input type="file" name="csvfile"/> &nbsp;<input type="submit" value="上传"></div>
<div id="upload_info" style="width:100%;border:1px solid #809db9;display:none" ></div>
</form>

target="uploadcvs",添加target时调试代码不好调试,建议调试时去掉这行代码

php代码:

 代码如下 复制代码

public function csvAction(){
    //获取上传文件名$fileinfo,包含文件的扩展
    $fileinfo = pathinfo($_FILES['csvfile']['name']);
    //判断文件扩展是不是csv
    if(!in_array(strtolower($fileinfo['extension']),array('csv'))){
        $feed = array('status'=>'ext');
    //判断文件的大小
    }else if($_FILES['csvfile']['size'] > 1*1024*1024){
        $feed = array('status'=>'size');
    }else{
        //成功时数组
        $succdata = array();
        //错误时数组
        $errdata = array();
        //计数,计算多少行
        $count = 0;
        //打开临时文件,只读形式
        $handle = fopen($_FILES['csvfile']['tmp_name'],"r");

        //获取数据库中的username信息  
        $userMongo = new Application_Model_DbTable_MongoUsers();
        $dbUsers = $userMongo->findAll(array(),array('login.username'=>true));
        //把用户的username信息写入$users
        $users = array();
        foreach($dbUsers as $user){
            if(isset($user['login']['username']))
                $users[] = $user['login']['username'];
        }
        //逐行读取csv文件信息fgetcsv,fgetcsv($handle)
        while ($row = fgetcsv($handle)) {
            //读一行count就累加,这样就可以知道读了多少行
            $count ++ ;
            foreach($users as $user){
                //判断$row[0]是不是手机号&&$row[0]是不是等于$user也就是$users中是否有这条记录
                //判断成功时,把这条手机号写入数组$succdata
                if(preg_match('/^1(3|4|5|8)d{9}$/',$row[0]) && $user==$row[0]){
                    $succdata[$row[0]] = (string)$row[0];
                    break;                    
                }
            }
            //判断$succdata[$row[0]]是否存在,不存在写入$errdata
            if(!isset($succdata[$row[0]])){
                $errdata[$row[0]] = $row[0];
            }
        }
        //关闭文件
        fclose($handle);
        //把上传的cvs文件存到自己的项目中
        $url = $this->_helper->Upload->msgcsv($_FILES['csvfile'], $succdata, $errdata);
        //$count信息是关于csv文件有多少行记录,成功多少行,失败多少行
        $count = array('original'=>$count, 'success'=>count($succdata), 'error'=>count($errdata));
        //$feed,这里状态是成功的,count, 与 url 。
        //count是为了查看是否有失败的,url是为了查看失败的列表信息(因为上传时换回了3个文件,查看失败文件)
        $feed = array('status'=>'succ','count'=>$count, 'url'=>$url);   
    }
        //把数组json化 json_encode() json_encode()json编码
        $feed = json_encode($feed);
        //callback()函数 <script>parent.callback(".$feed.")</script>
        echo "<script>parent.callback(".$feed.")</script>";
        exit;
 }

js代码:

 代码如下 复制代码

//data就是".$feed."
function callback(data){   
    try{
     if(data.status =='ext'){
         alert('文件类型不正确');
         return false;
     }else if(data.status == 'size'){
         alert('文件不能超过1M');
         return false;
     }else if(data.status == 'succ'){
         //parseInt将字符串转化为整型 parseInt
         var html = parseInt(data.count.error) > 0 ? ' <a href="<?php echo UPLOAD_IMAGE_PATH;?>'+data.url.error+'">查看失败列表</a>' : '';
         //成功的条数,失败的条数
         $('#upload_info').html('成功导入:'+data.count.success+';失败:'+data.count.error+html);
         $('#upload_info').show();
      $('input[name=step3_hidden]').val(data.url.success);
         }      
    }catch(e){    
        alert('解析出错,请检查文件格式.');
    }
    return false;
}

Upload.php文件

 代码如下 复制代码

<?php
//上传处理
class Ata_Controller_Action_Helper_Upload extends Zend_Controller_Action_Helper_Abstract {

    //通知csv文件
    public function MsgCsv(&$source, $succdata, $errdata){

        //原cvs保留
        //文件存放目录
        $publicPath = realpath(APPLICATION_PATH."/../public/upload").'/';
        $csvPath = "msgcsv/".date('Y').'/'.date('m')."/";
        $path = $publicPath.$csvPath;
        //创建目录
        $this->mkdirs($path);
        //uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。uniqid()
        $filename = uniqid();
        //获取文件的扩展名
        $ext = pathinfo($source['name'], PATHINFO_EXTENSION);
        //创建空文件,目录,文件名,扩展
        $filepath = $path.$filename.'_org.'.$ext;
        //move_uploaded_file(),将上传的文件移动到新位置
        move_uploaded_file($source['tmp_name'], $filepath);

        //正确csv创建
        $content = '';
        //创建空文件,目录,文件名,扩展
        $succfile = $path.$filename.'_succ.'.$ext;
        //把$succdata的内容写入$content;
        foreach($succdata as $row){
            //连接字符串等同$content = $content.$row."n"
            $content .= $row."n";
        }
        $content = trim($content,"n");
        //file_put_contents(),把一个字符串写入文件中
        file_put_contents($succfile, $content);

        //错误csv创建
        $content = '';
        $errfile = $path.$filename.'_err.'.$ext;
        foreach($errdata as $row){
            $content .= $row."n";
        }
        $content = trim($content,"n");
        file_put_contents($errfile, $content);

        //返回3个文件(用于查看失败列表与把成功的列表内容写入隐藏域中传递到数据库中)
        return array(
            'orginal' => $csvPath.$filename.'_org.'.$ext,
            'success' => $csvPath.$filename.'_succ.'.$ext,
            'error' => $csvPath.$filename.'_err.'.$ext
        );
    }
    //删除文件
    //获取csv文件的前缀名
    public function rmMsgCsv($path){
        //$prefix获取csv文件的前缀名
        $prefix = str_replace('_succ.csv','',$path);
        //删除三个文件     
        unlink($prefix.'_org.csv');
        unlink($prefix.'_succ.csv');
        unlink($prefix.'_err.csv');
    }

    public function mkdirs($dir, $mode = 0777)  {
        return is_dir($dir) or ($this->mkdirs(dirname($dir)) and mkdir($dir, $mode));
    }
}

其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子。

首先yyuc框架是支持发送email的

在yyuc/yyuc.php 上加上如下代码:

 代码如下 复制代码

require_once(YYUC_LIB.'plugin/SendMail.php');
$sendMail = new SendMail();

二在wx conf.php 下配置下发送函数

 代码如下 复制代码

public static $email = array(
'reg'=>array('protocol'=>'smtp','smtp_host'=>'smtp.qq.com','smtp_user'=>'','smtp_pass'=>'','from'=>array('','注册信息')),
'findpwd'=>array('protocol'=>'smtp','smtp_host'=>'smtp.qq.com','smtp_user'=>'','smtp_pass'=>'','from'=>array('','密码找回'))
);

三 在相应的位置加上如下代码

 代码如下 复制代码

//
$wid=Session::get('wid');;
$pubs=new Model('pubs');
$pubs->field('uid')->find(array('id'=>$wid));
$uid=$pubs->uid;
$user=new Model('micro_car_yysj');
$user->field('noticeemailon,noticeemail')->find(array('uid'=>$uid));
$noticeemailon=$user->noticeemailon;
$noticeemail=$user->noticeemail;
 if($noticeemailon=="1"){
 sendMail::normal_send("reg", $noticeemail, "您好,您在系统有有预约试驾的用户", "您好,您在系统有有预约试驾的用户,请登录系统查看" ,$toname = '');
 }
//

[!--infotagslink--]

相关文章

  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • 通过两种方式增加从库――不停止mysql服务

    一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快...2015-11-08
  • c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
  • C#实现Socket通信的解决方法

    这篇文章主要介绍了C#实现Socket通信的解决方法,需要的朋友可以参考下...2020-06-25
  • 详解JS WebSocket断开原因和心跳机制

    这篇文章主要介绍了JS WebSocket断开原因和心跳机制,对websocket感兴趣的同学,可以参考下...2021-05-08
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 详解C# Socket异步通信实例

    本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
  • C# Socket的TCP通讯的实例代码

    本篇文章主要介绍了C# Socket的TCP通讯,socket通讯方式有两种:同步和异步,详细的介绍了这两种方法,有兴趣的可以了解一下。...2020-06-25
  • python使用socket高效传输视频数据帧(连续发送图片)

    本文主要介绍了python使用socket高效传输视频数据帧(连续发送图片),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-23
  • JS如何实现基于websocket的多端桥接平台

    我们在调试过程使用的工具有:modheader,postman等,但这些工具都会存在的问题:缺少客户端里相应的设备信息;即使将cookie信息复制出来,也是存在过期的问题;多个设备之间切换时不方便;针对这些存在的问题,我基于websocket双向通信的特点,实现了多端桥接管理平台...2021-05-15
  • 在页面中输出当前客户端时间javascript实例代码

    这篇文章主要介绍了在页面中输出当前客户端时间javascript实例代码的相关资料,需要的朋友可以参考下...2016-03-03
  • C语言中send()函数和sendto()函数的使用方法

    这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • 客户端实现蓝牙接收(C#)知识总结

    网上有关蓝牙接收的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来,蓝牙开发需要用到一个第三方的库InTheHand.Net.Personal.dll,感兴趣的朋友可以了解下,或许对你有所帮助...2020-06-25
  • C# 实现WebSocket服务端教程

    这篇文章主要介绍了C# 实现WebSocket服务端教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-08
  • vue配置多代理服务接口地址操作

    这篇文章主要介绍了vue配置多代理服务接口地址操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-08
  • C# Socket编程实现简单的局域网聊天器的示例代码

    这篇文章主要介绍了C# Socket编程实现简单的局域网聊天器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • AngularJS内建服务$location及其功能详解

    这篇文章主要为大家详细介绍了AngularJS内建服务$location及$location功能,感兴趣的小伙伴们可以参考一下...2016-07-06
  • C#创建Windows服务的实现方法

    这篇文章主要介绍了C#创建Windows服务的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码

    这篇文章主要介绍了js根据手机客户端浏览器类型,判断跳转官网手机网站多个实例代码,需要的朋友可以参考下...2016-05-04