php socket编程实例

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

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

服务端:

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

客户端:

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

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

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

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

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

do{ 
            //$buf =socket_read($connection, 1024, PHP_NORMAL_READ); 
            $buf =socket_read($connection1024, PHP_BINARY_READ); 
            //退出连接条件 
            var_dump($buf); 
            if($buf=="quit"){ 
                socket_write($connection"bye\0"); 
                break; 
            }else if($buf=="isok"){ 
                socket_write($connection"ok\0"); 
            } 
            echo $buf; 
            socket_write($connection"copy that\0"); 
    }while(1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值