操作系统:windows
web服务器:apache+mysql+php
背景:
1、已用C语言写好一个C/S的服务端的可执行程序,该服务端创建一个socket并绑定特定端口(比如6000),等待新连接到来进行数据通信。
2、如今想在web服务器中用php编写一个基于socket的页面,建立一个客户端的socket连接,来连接C/S的服务器,向C/S服务器发送指令和数据,触发C/S服务器来执行某些操作,借此来实现B/S和C/S的通信(举个例子,qq原本是C/S结构,现好比好比网页版的qq向C/S结构的qq服务器发数据)。
现有几个问题不明:
1、该方法是否可行?(毕竟网上很少见到B/S和C/S通过socket通信)
2、如可行,那每个客户端通过浏览器或其他途径执行该php页面,相对于可执行程序而言,是不是就要创建一个新连接(要是客户不断刷新页面,那服务器不是很快就要崩溃,在不改变原C/S服务器的前提下,如何实现对客户端的限制)。
3、现在看到很多动态页面通过在浏览器中里操作非web内容,比如页面中设个关机按钮,通过点击该按钮,来关闭一个指定的主机,或者整个页面类似于资源管理器操作,或者执行一些特殊运算等等。不知道这些是不是通过客户端请求服务器后调用某些B/S的可执行程序来实现的。

解决方案 »

  1.   

    谢谢这位仁兄提供了思路!马上去看soap
    期待更多的解决方案
      

  2.   

    就像新浪微博的新话题提醒
    就像126 邮箱的新邮件提醒都是ajax定时向服务器请求查询并返回。
      

  3.   

    要hold住socket client.如果是基于b/s,一般引入flash作为socket client.然后和javascript交互.
      

  4.   

    这位兄弟讲得太高深了,看不太懂,咋还跟flash扯上关系了,我就是想实现B/S的客户端访问C/S的服务端,有没有看的懂的解决方案?应该来说本质上b/s和c/s都是基于socket连接的呀,怎么会这么困难?
      

  5.   

    你是希望在php里使用SOCKET通信是么?碰巧有点代码..class socketClient{
    public $socketConnection;
    public $Connection;
    public $changed_sockets;

    public function __construct($ipAddress,$port){
    $this->socketConnection = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $this->Connection = socket_connect($this->socketConnection,$ipAddress, $port);
    $this->changed_sockets = array($this->socketConnection);
    }

    public function sendMsg($msg){
    socket_write($this->socketConnection, $msg);
    }
    public function recv(){
    $num_changed_sockets = socket_select($this->changed_sockets, $write = NULL, $except = NULL, NULL);
    foreach($this->changed_sockets as $socket) {
    $bytes = @socket_recv($this->socketConnection, $buffer, 2048, 0);
    return $buffer;
    }
    }
    public function close(){
    socket_close($this->socketConnection);
    }
    }代码短..就没注释了...
      

  6.   

    多谢了,这个确实可以通信,不过超过30秒就提示出错,服务器就断开连接了,另外服务器一给网页的客户端发数据,就会断开socket连接。
      

  7.   

    “B/S的客户端”就是“B”,就是浏览器,它是没有能力访问你的“C/S的服务端”的,它只能访问“HTTP服务器”。
    这就是为什么 5 楼扯出 flash 的原因 :)
      

  8.   

    那就算我的web服务器也不能访问c/s服务端的啊,我最初想的socket是最底层的,应该可以的,但是实际测的时候,结果不尽如人意。
    有没有一种解决方案,能够摒除B/S和C/S的“隔阂”,或者有个什么中间的桥梁能够将两者联系起来进行通信,是插件也好,新技术也许,请高手指个方向。
      

  9.   

    从 web 服务器上去访问 C/S 服务器是可以的。你可以在 web 服务器上写 PHP 程序,通过 socket 跟 C/S 服务器进行通信。这种方式比在客户端浏览器的 FLASH 里发起 socket 访问还好一些,因为 FLASH 会受到沙箱权限的限制,socket 不一定能通。
      

  10.   

    我就是用你说的这种方法,通过php,编写socket客户端程序,去访问C/S服务器,socket连接倒是可以,但是不管发不发数据,30秒左右就会自动断开,而且我通过网页进行测试,从c/s服务端返回的数据,也无法及时查看
      

  11.   

    不知道LZ实现了没有,我要做的恰好和你反过来,客户端用C,就是C/S结构的,服务器用PHP,刚开始。想问问你花了多长时间?做出来了吗?