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