为了账号安全,请及时绑定邮箱和手机立即绑定

请问 用mina 给客户端发送数据,要求分别以1秒,5秒,10秒等不同的频率发送不同的数据,给每一个连接的客户端

package com.tcp.mina.main;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.mina.core.IoUtil;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import com.safe.model.Police;
import com.safe.model.User;
import com.safe.service.CenterService;
import com.safe.util.ConstantUtil;
import com.safe.util.DateUtil;
import com.tcp.mina.frame.Frame;
import com.tcp.mina.model.M_p_HandingAlarm;
import com.tcp.mina.model.M_p_Pant;
import com.tcp.mina.model.M_p_PeopleInfo;
import com.tcp.mina.model.M_q_GetPeopleInfo;
import com.tcp.mina.model.M_q_HandingAlarm;
import com.tcp.mina.model.M_q_Pant;
import com.tcp.mina.model.PoliceTask;
import com.tcp.mina.msgcoder.MsgCoder;
import com.tcp.mina.thread.AllPoliceCoordsThread;
import com.tcp.mina.thread.HotPoliceCoordsThread;
import com.tcp.mina.thread.UserCoordsThread;
import com.tcp.mina.util.TCPConstant;

public class MyServerHandler extends IoHandlerAdapter {

	public static Map<Long, IoSession> allIoSessions;

	CenterService service;

	public MyServerHandler(CenterService service) {
		super();
		this.service = service;
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		System.out.println("exceptionCaught");
		cause.printStackTrace();
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		System.out.println("【server】messageReceived: " + message);
		Frame frame = null;
		if (message instanceof Frame) {
			frame = (Frame) message;
		} else {
			return;
		}
		int msgType = frame.getMsgType();
		switch (msgType) {
		/** 一 收到心跳 */
		case TCPConstant.MSGTYPE_Q_PANT:
			M_q_Pant m_q_Pant = new MsgCoder<M_q_Pant>().readFrame(frame,
					M_q_Pant.class);
			System.out.println("请求消息-心跳请求:" + m_q_Pant);
			// 响应心跳
			M_p_Pant p_Pant = new M_p_Pant();
			session.write(new MsgCoder<M_p_Pant>().readMsg(p_Pant));
			break;
		/** 二 获取人物信息请求 */
		case TCPConstant.MSGTYPE_Q_PEOPLEINFO:
			M_q_GetPeopleInfo q_GetPeopleMsg = new MsgCoder<M_q_GetPeopleInfo>()
					.readFrame(frame, M_q_GetPeopleInfo.class);
			int peopleType = q_GetPeopleMsg.getType();
			if (TCPConstant.PEOPLETYPE_POLICE == peopleType) {// 警员
				Police police = service.getPoliceByPoliceNo(q_GetPeopleMsg
						.getID().trim());
				String birthdayStr = DateUtil.fmtDateToStr(police.getDetails()
						.getBirthday(), "yyyy-MM-dd");

				Frame policeFrame = new MsgCoder<M_p_PeopleInfo>()
						.readMsg(new M_p_PeopleInfo(police.getPoliceNo(),
								peopleType, police.getDetails().getName(),
								birthdayStr, police.getDetails().getTel(),
								police.getDetails().getAddress(), police
										.getDetails().getShenFenId(), police
										.getDetails().getPhoto()));
				session.write(policeFrame);

			} else if (TCPConstant.PEOPLETYPE_USER == peopleType) {// 用户
				User user = service.getUserByLoginName(q_GetPeopleMsg.getID()
						.trim());
				String birthdayStr = DateUtil.fmtDateToStr(user.getDetails()
						.getBirthday(), "yyyy-MM-dd");
				Frame userFrame = new MsgCoder<M_p_PeopleInfo>()
						.readMsg(new M_p_PeopleInfo(user.getLoginName(),
								peopleType, user.getDetails().getName(),
								birthdayStr, user.getDetails().getTel(), user
										.getDetails().getAddress(), user
										.getDetails().getShenFenId(), user
										.getDetails().getPhoto()));
				session.write(userFrame);
			}
			break;
		/** 三 处理报警请求 */
		case TCPConstant.MSGTYPE_Q_HANDINGALARM:
			// 解析请求消息
			M_q_HandingAlarm q_handingMsg = new MsgCoder<M_q_HandingAlarm>()
					.readFrame(frame, M_q_HandingAlarm.class);
			// 操作派警
			int alarmId = q_handingMsg.getEventID();
			int type = q_handingMsg.getType();

			if (type == ConstantUtil.ALARM_TYPE_TRUE) {// 真警则派发任务
				// 派发任务
				List<PoliceTask> policeTasks = q_handingMsg.getTask();
				List<String> policeNos = new ArrayList<String>();
				String taskContent = "";
				for (PoliceTask policeTask : policeTasks) {
					policeNos.add(policeTask.getPoliceID());
					taskContent = policeTask.getTaskInfo();
				}
				service.sendTaskAndNotice(policeNos, taskContent, alarmId);
			} else {// 不是真警 则修改对应类型 1假警 2重复报警
				// 修改报警类别
				service.updateAlarmStatus(alarmId, type);
			}
			/** 响应该报警的最新状态 */
			// 发送处理报警的响应消息 1 这里直接返回给所有客户端,2警员提交任务时 发送给所有客户端
			// AlarmInfo alarmInfo=service.getAlarmById();
			// TODO 假数据
			M_p_HandingAlarm msg = new M_p_HandingAlarm(alarmId, 2);
			Frame pMsgframe = new MsgCoder<M_p_HandingAlarm>().readMsg(msg);
			// 获取所有正在连接的IoSession
			Collection<IoSession> sessions = session.getService()
					.getManagedSessions().values();

			// 将消息写到所有IoSession
			IoUtil.broadcast(pMsgframe, sessions);
			break;
		default:
			System.out.println("TCP:TCPListenRequest 未知的请求!~");
			break;
		}

		// session.write(message);
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("【server】messageSent: " + message);
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("【server】sessionClosed");
		System.out.println("有人关闭,当前客户数:" + allIoSessions.size());
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("【server】sessionCreated");
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		System.out.println("【server】sessionIdle");
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("【server】sessionOpened ID:" + session.getId());
		if (allIoSessions == null) {
			allIoSessions = session.getService().getManagedSessions();
		}
		System.out.println("有人连接,当前客户数:" + allIoSessions.size());
		new Thread(new AllPoliceCoordsThread(session, service)).start();
		new Thread(new HotPoliceCoordsThread(session, service)).start();
		new Thread(new UserCoordsThread(session, service)).start();

	}

}

请看sessionOpened() 我开启了三个线程每个线程里一个while 循环 sleep1秒。 这样三个线程同时以一定频率发送数据,结果报错了。就算只开一个线程频率太快了也会报错。客户端读取的数据错乱了。

我想在每一个客户端连接以后 给他们以不同的频率发送多种数据,该怎么实现呢?

每次都是报这个错误但是 打印的字节有时候是不一样的。

org.apache.mina.filter.codec.ProtocolDecoderException: java.nio.BufferUnderflowException (Hexdump: 06 64 61 57 53 41 00 07 FE FF 00 7B 00 22 00 4E 00 75 00 6D 00 22 00 3A 00 31 00 30 00 2C 00 22 00 70 00 6F 00 6C 00 69 00 63 00 65 00 73 00 22 00 3A 00 5B 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 31 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 32 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 33 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 34 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 35 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A 00 22 00 4F 00 4E 00 4C 00 49 00 4E 00 45 00 23 00 36 00 22 00 2C 00 22 00 45 00 76 00 65 00 6E 00 74 00 49 00 44 00 22 00 3A 00 30 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 58 00 22 00 3A 00 22 00 31 00 32 00 31 00 2E 00 30 00 22 00 2C 00 22 00 43 00 6F 00 6F 00 72 00 64 00 69 00 6E 00 61 00 74 00 65 00 59 00 22 00 3A 00 22 00 33 00 35 00 2E 00 30 00 22 00 7D 00 2C 00 7B 00 22 00 50 00 6F 00 6C 00 69 00 63 00 65 00 49 00 44 00 22 00 3A)

at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:242)

at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)

at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)

at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)

at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)

at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)

at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)

at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710)

at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)

at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)

at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)

at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)

at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:619)

Caused by: java.nio.BufferUnderflowException

at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:127)

at org.apache.mina.core.buffer.AbstractIoBuffer.get(AbstractIoBuffer.java:615)

at org.apache.mina.core.buffer.AbstractIoBuffer.get(AbstractIoBuffer.java:1321)

at com.tcp.mina.protocalcoder.FrameCumulativeDecoder.doDecode(FrameCumulativeDecoder.java:34)

at org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:176)

at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:232)

... 15 more


正在回答

举报

0/150
提交
取消
见证Android消息推送时刻
  • 参与学习       48192    人
  • 解答问题       203    个

本课程将一步步教你如何搭建出一个自己的Android推送平台

进入课程

请问 用mina 给客户端发送数据,要求分别以1秒,5秒,10秒等不同的频率发送不同的数据,给每一个连接的客户端

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信