周末2天,一天写了个php_cerl模块,完成cerl的php client,一天写了个pycerl模块,完成cerl的python client。呵呵,C++的server可以用php或者python来调用了。
对于我们之前用CERL写的HashServer这个服务器(一个很简单的样例,代码参阅:Erlang vs. CERL - CERL简介),其PHP写的Client样例如下:
view plaincopy to clipboardprint?
<?php
define('HashSever_put', 1);
define('HashSever_get', 2);
if (!extension_loaded('php_cerl')) {
if (!dl('php_cerl.' . PHP_SHLIB_SUFFIX))
die("ERROR: Cannot load php_cerl library!\n");
}
cerl_thread_init();
$server = cerl_connect('localhost:8889', 'HashServer');
if (!$server)
die("ERROR: Connect HashSever failed!\n");
printf(
"+-----------------------------------------------------------\n" .
"| put <key> <value> - Put (key, value)\n" .
"| get <key> - Get value of a key\n" .
"| q - Quit\n" .
"+-----------------------------------------------------------\n");
for (;;)
{
echo "\n> ";
list($cmd, $key, $value) = fscanf(STDIN, '%s%d%d');
if ($cmd == 'get' || $cmd == 'g')
{
$ret = $server->call(HashSever_get, $key);
if ($ret[0] == code_ok)
echo "result: $ret[1]\n";
else
echo "error: $ret[0]\n";
}
else if ($cmd == 'put' || $cmd == 'p')
{
$ret = $server->call(HashSever_put, $key, $value);
if ($ret[0] == code_ok)
echo "ok!\n";
else
echo "error: $ret[0]\n";
}
else if ($cmd == 'q')
{
break;
}
else
{
echo "unknown command!\n";
}
}
cerl_thread_term();
?>
<?php
define('HashSever_put', 1);
define('HashSever_get', 2);
if (!extension_loaded('php_cerl')) {
if (!dl('php_cerl.' . PHP_SHLIB_SUFFIX))
die("ERROR: Cannot load php_cerl library!\n");
}
cerl_thread_init();
$server = cerl_connect('localhost:8889', 'HashServer');
if (!$server)
die("ERROR: Connect HashSever failed!\n");
printf(
"+-----------------------------------------------------------\n" .
"| put <key> <value> - Put (key, value)\n" .
"| get <key> - Get value of a key\n" .
"| q - Quit\n" .
"+-----------------------------------------------------------\n");
for (;;)
{
echo "\n> ";
list($cmd, $key, $value) = fscanf(STDIN, '%s%d%d');
if ($cmd == 'get' || $cmd == 'g')
{
$ret = $server->call(HashSever_get, $key);
if ($ret[0] == code_ok)
echo "result: $ret[1]\n";
else
echo "error: $ret[0]\n";
}
else if ($cmd == 'put' || $cmd == 'p')
{
$ret = $server->call(HashSever_put, $key, $value);
if ($ret[0] == code_ok)
echo "ok!\n";
else
echo "error: $ret[0]\n";
}
else if ($cmd == 'q')
{
break;
}
else
{
echo "unknown command!\n";
}
}
cerl_thread_term();
?>
而Python写的Client样例如下:
view plaincopy to clipboardprint?
HashSever_put = 1
HashSever_get = 2
import sys, pycerl
pycerl.thread_init()
server = pycerl.connect("localhost:8889", "HashServer")
if not server:
print "ERROR: Connect HashSever failed!"
else:
print "+-----------------------------------------------------------"
print "| put <key> <value> - Put (key, value)"
print "| get <key> - Get value of a key"
print "| q - Quit"
print "+-----------------------------------------------------------"
while True:
sys.stdout.write("\n> ")
input = sys.stdin.readline().split()
cmd = input[0]
if cmd == "get" or cmd == "g":
if len(input) < 2:
continue
key = int(input[1], 10)
ret = server.call(HashSever_get, key)
if ret[0] == pycerl.code_ok:
print "result:", ret[1]
else:
print "error:", ret[0]
elif cmd == "put" or cmd == "p":
if len(input) < 3:
continue
key = int(input[1], 10)
value = int(input[2], 10)
ret = server.call(HashSever_put, key, value)
if ret[0] == pycerl.code_ok:
print "ok!"
else:
print "error:", ret[0]
elif cmd == "q":
break
else:
print "unknown command!"
pycerl.thread_term()
HashSever_put = 1
HashSever_get = 2
import sys, pycerl
pycerl.thread_init()
server = pycerl.connect("localhost:8889", "HashServer")
if not server:
print "ERROR: Connect HashSever failed!"
else:
print "+-----------------------------------------------------------"
print "| put <key> <value> - Put (key, value)"
print "| get <key> - Get value of a key"
print "| q - Quit"
print "+-----------------------------------------------------------"
while True:
sys.stdout.write("\n> ")
input = sys.stdin.readline().split()
cmd = input[0]
if cmd == "get" or cmd == "g":
if len(input) < 2:
continue
key = int(input[1], 10)
ret = server.call(HashSever_get, key)
if ret[0] == pycerl.code_ok:
print "result:", ret[1]
else:
print "error:", ret[0]
elif cmd == "put" or cmd == "p":
if len(input) < 3:
continue
key = int(input[1], 10)
value = int(input[2], 10)
ret = server.call(HashSever_put, key, value)
if ret[0] == pycerl.code_ok:
print "ok!"
else:
print "error:", ret[0]
elif cmd == "q":
break
else:
print "unknown command!"
pycerl.thread_term()
值得注意的是,这里我们没有像C/C++一样,用一个编译器为SDL翻译生成PHP/Python的Proxy代码。这是动态语言的优势,哪怕没有Proxy,其代码仍然看起来相当优雅(不过话又说回来,其实C++也可以做到的,但是略损失些性能)。
发表评论