ホームページ >バックエンド開発 >PHPチュートリアル >ソケット データを受信しますが、バインディング サーバーからのデータは常に送信されるのに、受信される文字列が 1 つだけなのはなぜですか?
送信されたデータは次のようになります@,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 回しか取得されません
データを一度に
どこでできるかモデレータに質問します。複数回リクエストする方法と、データ文字列の開始マークと終了マークを定義する必要がありますか?モデレーターありがとうございます
一度リクエストすると、当然データは一度しか取得されません
そのデータ文字列をデータベースに追加したい場合、形式 (元の形式または受信した形式) を変更してデータ文字列を呼び出す方法, 複数回呼び出します クライアントプログラムはデータを複数回受け取ることができます
データをデータベースに入れる方法は、データベースへの保存方法によって異なります
送信されるデータ形式は、使用ニーズに応じて設計する必要があります
クライアントを複数回呼び出します プログラムを終了すると、データを複数回受信できます
データをデータベースに入れる方法は、データベースへの保存方法によって異なります
送信されるデータ形式は、使用ニーズに応じて設計する必要があります
Highcharts の ajax サンプルを注意深く読むことをお勧めします
それは私のものよりも専門的であるに違いありません
result.data[i] の形式でデータの値を取得する方法がわかりません
コードリクエストは一度です もちろん結果です
コードリクエストはもちろん結果です
ウェブサイトを開いたのは一度だけです!リフレッシュを続けてリクエストを続けてください。したがって、これを追加しました(result.data、function(i){