本文目录一览:
C#使用PHP服务端的Web Service通信实例
这篇文章主要介绍了C#使用PHP服务端的Web
Service通信实例,需要的朋友可以参考下
注:本例中构建Web
Service采用SOAP方式,通过php插件NuSoap来搭建SOAP服务器。
代码如下:
?
require_once("lib/nusoap.php");
//调用NuSoap
$server
=
new
soap_server();
//创建soap服务端
$server-configureWSDL("login_service");
//配置WSDL
$namespace
=
"";
$server-wsdl-schemaTargetNamespace
=
$namespace;
//设置wsdl命名空间为
$server-register(
//
注册Web服务
'login_verifiy',
//定义名称
array('name'='xsd:string','pw'='xsd:string'),
//接受参数
array('return'='xsd:string'),
//返回
$namespace,
//命名空间
false,
//
soapaction:默认
'rpc',
//
类型:
rpc
or
document
'encoded',
//
参数:encoded(编码)或
literal(文字)
'A
web
method
of
login'
//描述
);
$POST_DATA
=
isset($GLOBALS['HTTP_RAW_POST_DATA'])?
$GLOBALS['HTTP_RAW_POST_DATA']
:
'';
$server-service($POST_DATA);
//将提交的数据传递给soap服务
function
login_verifiy($user,$pw)
{
//服务执行内容,本示例中为显示输入的帐号密码
return
'user:'.$user.'
password:'.$pw);
}
?
C#客户端调用:
代码如下:
[DllImport("kernel32")]
//调用api函数读ini文件。返回值为字符串缓冲区的长度
private
static
extern
long
GetPrivateProfileString(string
section,
string
key,
string
def,
StringBuilder
retVal,
int
size,
string
filePath);
private
void
Form1_Load(object
sender,
EventArgs
e)
{
StringBuilder
temp
=
new
StringBuilder(256);
GetPrivateProfileString("system",
"url",
null,
temp,
256,
System.IO.Directory.GetCurrentDirectory()+"config.ini");
//通过读取config.ini配置文件(结构见附加内容)来获取webservice
url
Program.server_url
=
temp.ToString();
//Program.cs中的全局变量server_url用以储存webservice
url
}
private
void
button1_Click(object
sender,
EventArgs
e)
{
WebReference.login_service
l
=
new
WebReference.login_service();
string
s=l.login_verifiy(username.Text,
password.Text);
MessageBox.Show(s);
}
附config.ini内容:
代码如下:
[system]
url=
在线等:如何使同一客户端请求的多个相同的php脚本实例同时运行?
你的写LOG和读LOG的原理是什么呢?
或者你可以提供部分文件给我,我帮你看看
正如你提供的连接显示的内容,你考虑先清空缓存,再在ShowLog的PHP里禁止缓存试试。
PHP禁止缓存:
理论上即使有100个页面同时require application_top.php,每个页面都打开一个数据库连接,也不会出现你说的情况的,因为MYSQL和APACHE一样是支持并发的。建议你仔细分析一下你的代码。
这种情况只出现在FIREFOX中,IE下不会的。似乎FIREFOX一个URL只能同时有一个线程读取。你可以测试一下,分别用IE和FIREFOX执行以下的test.php
test.php文件:
?php
for($i=0; $i100; $i++){
echo $i . "br/";
ob_flush(); flush();
sleep(1);
}
解决办法是在URL后多加上一个时间戳,保证每次的URL都不一样,有不会影响你的代码。例如test.php?23423432, test.php?9923432 这样就能同时执行了
如果像ajax83316说的那样,你在程序里使用了耗时的独占且锁定资源(尤其是数据库)的算法,只能优化你的算法了,别无它法
补充说明,服务器可以同时为很多客户端(取决于你的服务器配置)执行一个程序(例如test.php)。像新浪的首页也许同时有10000个用户在调用。所以不会是服务器的问题。
如何通过php实现mqtt协议
MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现。
架构如下所示:
wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。
Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。
SAM是一个针对MQTT写的PHP库。你可以从这个下载它.
send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。
实例代码:
Ø 采用XMPP协议实现Android推送
这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:
androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。
androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:
最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。
服务器端界面如下,分别对应了上述的几个功能模块:
发送以后,我们可以在手机端看到接收的消息: