首页  >  文章  >  php教程  >  php socket编程实例

php socket编程实例

WBOY
WBOY原创
2016-06-06 19:47:281183浏览

因为用到客户端程序与网页三方支付接口交互,我觉得可以这样来简单实现,在三方支付回调页面中放一个socket服务端,客户端程序与这个socket服务端进行交互,以此来进行最终业务逻辑处理。 php中socket编程,简单实例代码如下: 服务端: ?php set_time_limit

因为用到客户端程序与网页三方支付接口交互,我觉得可以这样来简单实现,在三方支付回调页面中放一个socket服务端,客户端程序与这个socket服务端进行交互,以此来进行最终业务逻辑处理。

php中socket编程,简单实例代码如下:

服务端:

<code><span><span><?php </span> 
set_time_limit(<span>0</span>); 
 
<span>if</span>(!extension_loaded(<span>'sockets'</span>)){ 
    <span>//die('服务器未加载sockets扩展');</span> 
    <span>if</span>(strtoupper(substr(<span>PHP_OS</span>, <span>3</span>)) == “WIN”)  
    {  
        dl(‘php_sockets.dll’); 
    } 
    <span>else</span> 
    { 
        dl(‘sockets.so’);  
    }  
} 
 
<span>$</span><span>sock</span> = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); 
<span>if</span>(!<span>$</span><span>sock</span>){ 
    <span>die</span>(<span>'创建socket失败'</span>); 
} 
 
<span>if</span>(!socket_bind(<span>$</span><span>sock</span>,<span>$_SERVER</span>[<span>'SERVER_ADDR'</span>],<span>9394</span>)){ 
    <span>die</span>(<span>'socket绑定失败'</span>); 
} 
 
<span>if</span>(!socket_listen(<span>$</span><span>sock</span>)){ 
    <span>die</span>(<span>'socket监听失败'</span>); 
} 
 
<span>$</span><span>client_id</span> = <span>0</span>; 
<span>do</span>{ 
    <span>//阻塞,直到有客户端连接</span> 
    <span>$</span><span>connection</span> = socket_accept(<span>$</span><span>sock</span>); 
    ++<span>$</span><span>client_id</span>; 
    printf(<span>"Socket connected-$client_id\n"</span>); 
 
    <span>$</span><span>buffer</span>=<span>'Hello, world!'</span>; 
    socket_write(<span>$</span><span>connection</span>, <span>$</span><span>buffer</span> . <span>"\n"</span>); 
 
    <span>do</span>{ 
            <span>$</span><span>buf</span> =socket_read(<span>$</span><span>connection</span>, <span>1024</span>, PHP_NORMAL_READ); 
            <span>//退出连接条件</span> 
            <span>if</span>(<span>$</span><span>buf</span>==<span>"100\n"</span>){ 
                socket_write(<span>$</span><span>connection</span>, <span>'bye'</span> . <span>"\n"</span>); 
                <span>break</span>; 
            } 
            <span>echo</span> <span>$</span><span>buf</span>; 
            socket_write(<span>$</span><span>connection</span>, <span>'copy that'</span> . <span>"\n"</span>); 
    }<span>while</span>(<span>1</span>); 
 
    socket_close(<span>$</span><span>connection</span>); 
}<span>while</span>(<span>1</span>); 
 
socket_close(<span>$</span><span>sock</span>); 
<span>?></span> 
</span></span></code>

客户端:

<code><span><span><?php </span> 
<span>if</span>(!extension_loaded(<span>'sockets'</span>)){ 
    <span>//die('服务器未加载sockets扩展');</span> 
    <span>if</span>(strtoupper(substr(<span>PHP_OS</span>, <span>3</span>)) == “WIN”)  
    {  
        dl(‘php_sockets.dll’); 
    } 
    <span>else</span> 
    { 
        dl(‘sockets.so’);  
    }  
} 
 
<span>$</span><span>socket</span> = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); 
<span>if</span>(!<span>$</span><span>socket</span>){ 
    <span>die</span>(<span>'创建socket失败'</span>); 
} 
 
<span>$</span><span>connection</span> = socket_connect(<span>$</span><span>socket</span>,<span>'localhost'</span>, <span>9394</span>); 
 
<span>$</span><span>send</span>=<span>0</span>; 
<span>do</span>{ 
    <span>$</span><span>buffer</span> = socket_read(<span>$</span><span>socket</span>, <span>1024</span>, PHP_NORMAL_READ); 
    <span>//退出连接条件</span> 
    <span>if</span>(<span>$</span><span>buffer</span>==<span>"bye\n"</span>){ 
        <span>break</span>; 
    } 
 
    <span>echo</span> <span>$</span><span>buffer</span>; 
    ++<span>$</span><span>send</span>; 
    socket_write(<span>$</span><span>socket</span>, <span>$</span><span>send</span> . <span>"\n"</span>); 
}<span>while</span>(<span>1</span>); 
 
socket_close(<span>$</span><span>socket</span>); 
<span>?></span> 
</span></span></code>

与c++程序交互,客户端:

<code><span>#include</span> <winsock2.h><span> 
#include</span> <iostream><span> 
#pragma</span> comment(lib,<span>"ws2_32.lib"</span>) 
<span>using</span> <span>namespace</span> std; 
 
<span>int</span> main(<span>int</span> argc, <span>char</span>* argv[]) 
{ 
    WSADATA wsaData; 
    <span>WORD</span> wVersionRequested=MAKEWORD(<span>2</span>,<span>2</span>); 
    <span>int</span> err = WSAStartup(wVersionRequested,&wsaData); 
    <span>if</span> (!err) 
    { 
        cout"inital socket success"0,NULL,<span>0</span>,WSA_FLAG_OVERLAPPED); 
        <span>if</span> (sock != INVALID_SOCKET) 
        { 
            cout"create socket success""127.0.0.1"); 
            addr.sin_family=AF_INET; 
            addr.sin_port=htons(<span>9394</span>); 
            <span>int</span> errcon = connect(sock,(SOCKADDR*)&addr,<span>sizeof</span>(SOCKADDR)); 
            <span>if</span> (errcon == SOCKET_ERROR) 
            { 
                cout"connection failed:"return -<span>1</span>; 
            } 
            cout"connection success"char sendBuf[<span>1024</span>]={<span>0</span>}; 
            <span>char</span> recvBuf[<span>1024</span>]={<span>0</span>}; 
 
            recv(sock,recvBuf,<span>1024</span>,<span>0</span>); 
            coutwhile (TRUE) 
            { 
                cout"Please input data:">sendBuf; 
                <span>if</span> (sendBuf==NULL) 
                { 
                    <span>break</span>; 
                } 
 
                send(sock,sendBuf,strlen(sendBuf),<span>0</span>); 
                Sleep(<span>500</span>); 
                recv(sock,recvBuf,<span>1024</span>,<span>0</span>); 
                coutif (!strcmp(recvBuf,<span>"bye"</span>)) 
                { 
                    cout"connection over"break; 
                } 
                Sleep(<span>500</span>); 
            } 
            closesocket(sock); 
            WSACleanup(); 
        }  
        <span>else</span> 
        { 
            cout"create socket failed"else 
    { 
        cout"inital socket failed"return <span>0</span>; 
} 
</iostream></winsock2.h></code>

与c/c++程序交互,php服务端读取数据应该用二进制模式读取:

另外,发送数据时,字符串末尾要加\0:

<code><span>do</span>{ 
            <span>//$buf =socket_read($connection, 1024, PHP_NORMAL_READ);</span> 
            <span>$</span><span>buf</span> =socket_read(<span>$</span><span>connection</span>, <span>1024</span>, PHP_BINARY_READ); 
            <span>//退出连接条件</span> 
            var_dump(<span>$</span><span>buf</span>); 
            <span>if</span>(<span>$</span><span>buf</span>==<span>"quit"</span>){ 
                socket_write(<span>$</span><span>connection</span>, <span>"bye\0"</span>); 
                <span>break</span>; 
            }<span>else</span> <span>if</span>(<span>$</span><span>buf</span>==<span>"isok"</span>){ 
                socket_write(<span>$</span><span>connection</span>, <span>"ok\0"</span>); 
            } 
            <span>echo</span> <span>$</span><span>buf</span>; 
            socket_write(<span>$</span><span>connection</span>, <span>"copy that\0"</span>); 
    }<span>while</span>(<span>1</span>); 
</code>
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn