解决方案 »

  1.   

    楼主要明白socket是什么意义。socket是网络接口,它的后端链接的是一个应用服务。比如你提到的Telnet服务他的socket端口是23,这个端口是由Telnet侦听的。apache端口80。
    如果你要用php对外开放服务,可以考虑使用webservice。
      

  2.   

    我主要需要用这个接口,接收对方发过来的xml文件,然后根据xml里面的内容,在反馈对方需要的信息给对方,完成操作。
    我已经把开放的端口,通过服务器配置,指定区访问一个文件,不知道这个做法是不是对的
      

  3.   

    另外:socket_bind这个函数,绑定端口,是否是一定要绑定到用户访问的端口,还是说收到访问了,我在单独绑定一个端口给他。
    目前我开放的端口,我自己测试,总提示我这个端口已经使用。
    对方访问通过网站发送数据,我就把端口httpd使用了,是否这样配置不正确?
      

  4.   

    是的,端口被打开了就不能复用
    所以通讯时需要先打开一个周知的端口,一旦监听到该端口有信息时
    就需要打开一个空闲端口,并将该端口通知对方,用于后续的通讯服务方的主监听程序需要常驻内存,只能启动一次
    通讯是通过子进程进行的需要注意的是:php 适合做客户端,而不适合做服务端
    可能以后更高的版本会有所改变,至少在php5.5也还是没有改变(虽然已经列入开发计划)
      

  5.   

    如果你需要xml进行通信的话,webservice就是最好的选择。你可以了解一下webservice,比如soap。你只要开放webservice对方调用就可以,而且对方可以是任何语言或程序。
      

  6.   

    对方指定要使用tcp/ip模式,需要支持多线程处理,socket短连接!
      

  7.   

    webservice我去看看,是否能达到对方的要求?
      

  8.   

    楼主要的东西其实就是RPC,我有一个,你可以直接拿去用,
    https://github.com/walkor/workerman开发文档在:http://www.workerman.net/documentation
    安装部署开发都非常方便。如果有啥不明白,可以随时联系我
      

  9.   


    //server.php
    set_time_limit(0);
    // Set up our socket
    $commonProtocol = getprotobyname("tcp");
    $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
    socket_bind($socket, '192.168.10.224', 50004);
    socket_listen($socket,5);
    // Initialize the buffer
    $buffer = "";
    while(true)
    {
    $run=file_get_contents("./run.txt");
    if($run==0)break;
    // Accept any connections coming in on this socket

    $connection = socket_accept($socket);
    printf("Socket 链接中\r\n");
    // Check to see if there is anything in the buffer
    if($buffer != "")
    {
       printf("写入开始 缓冲区内容发送..\r\n");
       socket_write($connection, $buffer . "\r\n");
       printf("写入结束 \r\n");
    }
    else
    {
       printf("缓冲区无数据\r\n");
    }
    // Get the input   socket_read($connection, 1024)
    while($data = socket_read($connection, 4096))
    {
    if($run==0)break;
       $buffer = $data;
       //写入客户端数据
       file_put_contents("./txt.txt", json_encode($data)."\n",FILE_APPEND);
       socket_write($connection, "Information Received\r\n");
       printf("读结束 缓冲区内容: " . $buffer . "\r\n");
    }
    socket_close($connection);
    printf("关闭 socket\r\n\r\n");
    }//命令行里 输入:  php server.php//client.php 直接浏览器访问
    $stime = microtime(true);
    $fp = stream_socket_client("tcp://192.168.10.224:50004", $errno, $errstr, 30,STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
     
        fwrite($fp,$msg,mb_strlen($msg));
     
        echo fread($fp, 4096)."\n";
        fclose($fp);
    }$etime = microtime(true);echo "Time: " . ($etime - $stime) . "n";
    //我目前杀掉占用端口太麻烦,直接用文件控制退出 。run.txt 文件存 0或1 
     
      

  10.   

    webservice叫这么个名字而已,遵循了一定规则,本质就是http的东西当然是tcp/ip,可以支持多线程。apache侦听80端口,80端口本来就是个socket