ホームページ >バックエンド開発 >PHPチュートリアル >ソケット データを受信しますが、バインディング サーバーからのデータは常に送信されるのに、受信される文字列が 1 つだけなのはなぜですか?

ソケット データを受信しますが、バインディング サーバーからのデータは常に送信されるのに、受信される文字列が 1 つだけなのはなぜですか?

WBOY
WBOYオリジナル
2016-06-23 13:02:03727ブラウズ

送信されたデータは次のようになります@,13,56,89,5,21,64,79,51,46,31,$、受信したデータは次のようになります
{"is_ok":1,"data": @ ,13,56,89,5,21,64,79,51,46,31,$}
しかし、データはすべて同じデータ文字列ですが、1 つの文字列のみを受け付け、その後は受け付けません。データの開始マークと終了マークを定義するのはなぜでしょうか。 !サーバー側のデータベースに追加したいのですが、jsonデータ形式に変換するにはどうすればよいでしょうか?データの送信形式を変更するにはどうすればよいですか? ajax を使用してデータを取得し、後でそれをハイチャートに追加する必要があるため、このデータ文字列を呼び出すにはどうすればよいですか? json配列として書かれているのでしょうか?

/*------------------------------------------------------ *///-- socket客户端/*------------------------------------------------------ */ //+error_reporting(0);set_time_limit(0); // 接收GET数据$msg = isset($_GET['msg']) ? trim($_GET['msg']) : ''; // socket错误代码function strerror($code) {    $str = '';    switch($code) {        case 10022:            $str = '参数错误';            break;        case 10048:            $str = '通常每个套接字地址(协议/网络地址/端口)只允许使用一次。';            break;        case 10061:            $str = '由于服务器积极拒绝,连接失败!';            break;        default:            $str = '未知错误';            break;    }    return $str;} function get_server_config() {    return simplexml_load_file('include/server_config.xml');}// 获取socket服务端配置信息$server_conf = get_server_config();$ip = $server_conf->ip;$port = (int)$server_conf->port; $out_str = '{"is_ok":0,"data":'; // 创建socketif(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {    $out_str .= '"' . strerror(socket_last_error()) . '"}';} // 连接到服务器else if(socket_connect($socket, $ip, $port) === false) {    $out_str .= '"' . strerror(socket_last_error($socket)) . '"}';} // 向服务器发送请求else if(socket_write($socket, $msg, strlen($msg)) === false) {    $out_str .= '"' . strerror(socket_last_error($socket)) . '"}';} else if(($out = socket_read($socket, 8192)) === false) {    $out_str .= '"' . strerror(socket_last_error($socket)) . '"}';} else {    $out_str = '{"is_ok":1,"data":' . $out . '}';} echo $out_str; // 关闭socketsocket_close($socket); /*------------------------------------------------------ *///-- socket服务端/*------------------------------------------------------ */ include('include/init.php');// 设置时区//date_default_timezone_set('Etc/GMT-8'); echo str_repeat(' ', 4000);error_reporting(0);set_time_limit(0); ob_start(); // 显示提示信息function show_tip($msg, $is_ok=true) {    if($is_ok) {        $msg = '<font color=\"#090\">' . $msg . '</font>';    } else {        $msg = '<font color=\"#f00\">' . $msg . '</font>';    }    echo '<script>parent.$("#tip").showTip("' . date('Y-m-d H:i:s', time()) . '","' . $msg . '");</script>';    ob_flush();    flush();    sleep(1);} // 获取socket服务端配置信息$server_conf = get_server_config();$ip = $server_conf->ip;$port = (int)$server_conf->port;$server_name = $server_conf->name; show_tip($server_name . ' 正在初始化...'); // 创建socketif(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {    show_tip($server_name . ' 创建失败,原因:' . strerror(socket_last_error()), false);} else {    show_tip($server_name . ' 创建成功!');} // 绑定socket到指定IP,端口if(socket_bind($socket, $ip, $port) === false) {       show_tip('绑定 ' . $server_name . ' 失败,原因:' . strerror(socket_last_error($socket)), false);} else {    show_tip('绑定 ' . $server_name . ' 到 ' . $ip . ', ' . $port);} // 监听if(socket_listen($socket, 5) === false) {    show_tip($server_name . ' 监听失败,原因:' . strerror(socket_last_error($socket)), false);} else {    show_tip($server_name . ' 正在监听中...');    echo '<script>location.href="login.php";</script>';    ob_flush();    flush();} static $w_socket = null;    // webstatic $a_socket = null;    // android $rNodeDataModel = new NodeDataModel(); do {    if(($msg_socket = socket_accept($socket)) === false) {        socket_close($msg_socket);        break;    } else {        if(($buffer = socket_read($msg_socket, 8192)) !== false) {             $buffer = trim($buffer);             if($buffer == 'web') {                $w_socket = $msg_socket;            } else if($buffer == 'android') {                $a_socket = $msg_socket;            } else if($buffer != 'stop') {                 $str_arr = explode('&', $buffer);                if(!empty($str_arr[1])) {                     $c_name = trim($str_arr[0]); // 客户端标识                    $c_data = trim($str_arr[1]); // 客户端数据                    if($c_name == 'computer') {                        // 判断数据是否为json格式                        if(($r_arr = json_decode($c_data, true)) != null) {                             if($w_socket != null) {                                socket_write($w_socket, $c_data, strlen($c_data));                            }                            if($a_socket != null) {                                socket_write($a_socket, $c_data, strlen($c_data));                            }                             // 添加到数据库                            foreach($r_arr as $v) {                                $v['node_id'] = $v['point'];                                unset($v['point']);                                $v['create_time'] = time();                                $rNodeDataModel->insert($v);                            }                        }                    }                 }                 socket_close($msg_socket);             } else {                socket_close($msg_socket);            }        } else {            socket_close($msg_socket);        }    } } while($buffer != 'stop'); // 关闭socketsocket_close($w_socket);socket_close($a_socket);socket_close($socket);


ディスカッション (解決策) に返信

1 回リクエストすると、当然データは 1 回しか取得されません

データを一度に

どこでできるかモデレータに質問します。複数回リクエストする方法と、データ文字列の開始マークと終了マークを定義する必要がありますか?モデレーターありがとうございます

一度リクエストすると、当然データは一度しか取得されません

そのデータ文字列をデータベースに追加したい場合、形式 (元の形式または受信した形式) を変更してデータ文字列を呼び出す方法,

複数回呼び出します クライアントプログラムはデータを複数回受け取ることができます
データをデータベースに入れる方法は、データベースへの保存方法によって異なります
送信されるデータ形式は、使用ニーズに応じて設計する必要があります

クライアントを複数回呼び出します プログラムを終了すると、データを複数回受信できます
データをデータベースに入れる方法は、データベースへの保存方法によって異なります
送信されるデータ形式は、使用ニーズに応じて設計する必要があります


その方法取得したデータを各チャートテーブルに割り当てます、{"is_ok":1,"data":[13,56,89,5,21,64,79,51,46,31]}系列内のデータを表します。いくつかの実践的な提案をいただければ幸いです。ありがとうございます

Highcharts の ajax サンプルを注意深く読むことをお勧めします
それは私のものよりも専門的であるに違いありません

result.data[i] の形式でデータの値を取得する方法がわかりません

コードリクエストは一度です もちろん結果です

コードリクエストはもちろん結果です

ウェブサイトを開いたのは一度だけです!リフレッシュを続けてリクエストを続けてください。したがって、これを追加しました(result.data、function(i){
01.series[index] .addpoint([x、parsefloat(result.data [i])]、true、true);
chart03を追加しました。 .series[index].addPoint([x, parseFloat(result.data[i])], true, true);
chart04.series[index].addPoint([x, parseFloat(result.data[i])] 、 true、true);
chart05.series[index].addPoint([x, parseFloat(result.data[i])], true, true); ;
chart07.series[index].addPoint([x, parseFloat(result.data[i])], true, true);
chart08.series[index].addPoint( [x, parseFloat(result.data[i]) ])]、true、true);
chart10 .series[index].addPoint([x, parseFloat(result.data[i])], true, true); },1000);//1000 は自動的に取得されます毎回データ
重要なのは、データの値を与えることです chart1.series[index].addPoint([x, parseFloat(result.data[i])]
);
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。