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

php socket编程实例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-06 19:47:28
Original
1270 people have browsed it

因为用到客户端程序与网页三方支付接口交互,我觉得可以这样来简单实现,在三方支付回调页面中放一个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>
Copy after login

客户端:

<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>
Copy after login

与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>
Copy after login

与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>
Copy after login
Related labels:
Statement of this Website
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
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template