接收socket数据,但是绑定服务器那边数据是一直发的,为什么只接受到一串

GodFu1012 2016-06-03 09:26:19
发送数据是这样@,13,56,89,5,21,64,79,51,46,31,$的,我接收的是这样的
{"is_ok":1,"data":@,13,56,89,5,21,64,79,51,46,31,$}
但是数据是一直发,虽然都是同一串数据,但是我只接受一串,后面就没有了,怎么定义数据的开始和结束标志的!!想在服务端添加到数据库看看,但是怎么转成json数据格式啊!发送数据格式要怎么改,因为后面要用ajax得到数据添加到highchart,怎么调用这串数据啊!是写成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":';

// 创建socket
if(($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;

// 关闭socket
socket_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 . ' 正在初始化...');

// 创建socket
if(($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; // web
static $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');

// 关闭socket
socket_close($w_socket);
socket_close($a_socket);
socket_close($socket);
...全文
271 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
GodFu1012 2016-07-19
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你多次调用客户端程序,就可多次收到数据了 如何把数据放进数据库,取决于你数据库中是如何保存的 传输的数据格式应按你的使用需求进行设计
网站打开,接收到一串数据,没办法多次调用客服端程序啊~
GodFu1012 2016-06-08
  • 打赏
  • 举报
回复
引用 8 楼 liuruijie123 的回复:
你代码请求一次当然是一个结果
我把网站打开,只打开一次啊!不停刷新才不断请求啊。所以加了这个 $.each(result.data, function(i) { var index = parseInt(result.data[i].point) - 1; chart01.series[index].addPoint([x, parseFloat(result.data[i])], true, true); chart02.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); chart06.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); chart09.series[index].addPoint([x, parseFloat(result.data[i])], true, true); chart10.series[index].addPoint([x, parseFloat(result.data[i])], true, true); },1000);//1000每隔时间会自动取数据 关键怎么data的值怎么给坐标 chart1.series[index].addPoint([x, parseFloat(result.data[i])], true, true);
jaysones 2016-06-08
  • 打赏
  • 举报
回复
你代码请求一次当然是一个结果
GodFu1012 2016-06-08
  • 打赏
  • 举报
回复
就是把data的值,怎么拿出来不知道,像result.data[i]这种形式
xuzuning 2016-06-08
  • 打赏
  • 举报
回复
建议你认真阅读一下 Highcharts 的 ajax 范例 肯定要比我专业的多
GodFu1012 2016-06-08
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你多次调用客户端程序,就可多次收到数据了 如何把数据放进数据库,取决于你数据库中是如何保存的 传输的数据格式应按你的使用需求进行设计
function connect() {
		$.ajax({
			url: 'client.php?msg=web',
			type: 'get',
			dataType: 'json',
			success: function(result) {//由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。
				  $('#tb tr:gt(0)').remove();//删除之前的数据
				if(result.is_ok) {
					var x = (new Date()).getTime();

					$.each(result.data, function(i) {
						var index = parseInt(result.data[i].point) - 1;

						chart01.series[index].addPoint([x, parseFloat(result.data[i])], true, true);
						chart02.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);
						chart06.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);
						chart09.series[index].addPoint([x, parseFloat(result.data[i])], true, true);
						chart10.series[index].addPoint([x, parseFloat(result.data[i])], true, true);
					},1000);//这里的是隔时间自动取数据
				} else {
					error = true;
					layer.alert(result.data);
				}
	        },
			complete: function(XHR, TS) {//请求完成后回调函数 (请求成功或失败之后均调用)。
				XHR = null; // 释放XMLHttprequest对象
				if(!error)
					connect();
			}
		});
	}

	function create_data() {
		var data = [],
			time = (new Date()).getTime(),
			i;

		for (i = -19; i <= 0; i++) {
			data.push({
				x: time + i * 1000
			});
		}
		return data;
	}
	var chart01, chart02, chart03, chart04, chart05, chart06, chart07,chart08,chart09,chart10;
	function create_chart(id, t, y_t) {
		var chart = new Highcharts.Chart({
			chart: {
				renderTo: id,
				type: 'spline',
				animation: Highcharts.svg,
				backgroundColor: '#272735',
				events: {
					load: connect
				}
			},
			title: {
				text: t
			},
			xAxis: {
				type: 'datetime',
				tickPixelInterval: 150
			},
			yAxis: {
				title: {
					text: y_t
				},
				plotLines: [{//线
					value: 0,
					width: 1,
					color: '#808080'
				}]
			},
			tooltip: {
				formatter: function() {
					return '<b>'+ this.series.name +'</b><br/>'+
					Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x);
				}
			},
			series: [{
				name: '实时数据',
				data: [29.9, -71.5, 106.4, 15.2, 144.0, 258.0, 135.6, 177.5, 216.4, 194.1, 95.6, 54.4] //create_data()
			}],
			credits:{
				 enabled:false
			}
		});

		return chart;
	}
如何把取到的data数据赋给每个chart表,{"is_ok":1,"data":[13,56,89,5,21,64,79,51,46,31]},如何在series中的data表示出来。希望给一些实质的建议。谢谢
xuzuning 2016-06-04
  • 打赏
  • 举报
回复
你请求一次,自然只得到一次数据
xuzuning 2016-06-04
  • 打赏
  • 举报
回复
你多次调用客户端程序,就可多次收到数据了 如何把数据放进数据库,取决于你数据库中是如何保存的 传输的数据格式应按你的使用需求进行设计
GodFu1012 2016-06-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你请求一次,自然只得到一次数据
如果要把那串数据添加到数据库,那串数据要怎么修改格式(原始格式或者接收到的)和调用,
GodFu1012 2016-06-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你请求一次,自然只得到一次数据
哪请问版主,怎么多次请求,还有时间间隔怎么写的,用不用定义那串数据的开始和结束标记啊!谢谢版主

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧