Home >php教程 >php手册 >php socket编程实例

php socket编程实例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-06 19:47:281269browse

因为用到客户端程序与网页三方支付接口交互,我觉得可以这样来简单实现,在三方支付回调页面中放一个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>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn