erro.png (268.9 KB, 下载次数: 1816)
下载附件 保存到相册
8 年前 上传
CharsetProtocolEncoderAdapter() { this.charset = Charset.forName("UTF8");; } public void encode(IoSession session, Object message, ProtocolEncoderOutput output) { ByteBuffer data = this.charset.encode((String) message); output.write(IoBuffer.wrap(data)); }
public boolean doDecode(IoSession session, IoBuffer buffer, ProtocolDecoderOutput output) { if (this.decodeReady) { if (buffer.remaining() < this.frameInfoData.getCapLength()) { return false; } else { try { byte[] data = new byte[this.frameInfoData.getCapLength()]; buffer.get(data); output.write(Pair.of(this.frameInfoData, ByteBuffer.wrap(data))); } finally { this.decodeReady = false; } return true; } } else if (buffer.remaining() < 16) { return false; } else { this.decodeReady = true; this.frameInfoData = new FrameInfoData(); byte byteOrder = buffer.get(buffer.position() + 11); buffer.order(byteOrder == 1 ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN); long seconds = UnsignedValue.toUint(buffer.getInt()); long microsnd = UnsignedValue.toUint(buffer.getInt()); int len = buffer.getInt(); int capLength = len & 16777215; int packetLength = buffer.getInt(); this.frameInfoData.timestamp(TimeUnit.SECONDS.toNanos(seconds) + TimeUnit.MICROSECONDS.toNanos(microsnd)); this.frameInfoData.capLength(capLength); this.frameInfoData.packetLength(packetLength); return true; } }
Encoder() { this.charset = Charset.forName("UTF8"); } @Override public void encode(IoSession session, Object msg, ProtocolEncoderOutput out) throws IOException { ByteBuffer msgByte = this.charset.encode((String) msg); out.write(IoBuffer.wrap(msgByte)); }
public void encode(IoSession session, Object msg, ProtocolEncoderOutput out) throws IOException { byte[] fileBytes=(byte[])msg; //The cap_len of a pcap packet does not include the pcap header, big-endian int capLen= fileBytes.length; //packet_len int packetSize = fileBytes.length +16; //second && microsecond Timestamp timeStamp = new Timestamp(System.currentTimeMillis()); long seconds = TimeUnit.NANOSECONDS.toSeconds(timeStamp.getTime()); long micros = TimeUnit.NANOSECONDS.toMicros(timeStamp.getTime() - TimeUnit.SECONDS.toNanos(seconds)); int capacity = fileBytes.length + 16; IoBuffer buffer = IoBuffer.allocate(capacity, false); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.setAutoExpand(true); buffer.putInt((int)seconds); buffer.putInt((int)micros); buffer.putInt(capLen); buffer.putInt(packetSize); buffer.put(fileBytes); buffer.flip(); out.write(buffer); buffer.clear(); }
public boolean doDecode(IoSession var1, IoBuffer in, ProtocolDecoderOutput out) throws CharacterCodingException { CharsetDecoder cd = Charset.forName("UTF8").newDecoder(); IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true); while(in.hasRemaining()){ buf.put(in.get()); } buf.flip(); out.write(buf.getString(cd)); return false; }
public void sessionOpened(IoSession session) throws Exception { System.out.println(session.getLocalAddress() + " " + "sessionOpened"); //客户端发送文件 byte[] fileBytes =toByteArray("/path/to/file/test.pcap"); session.write(IoBuffer.wrap(fileBytes)); } public static byte[] toByteArray(String filename) throws IOException { FileChannel fc = null; try { fc = new RandomAccessFile(filename, "r").getChannel(); MappedByteBuffer byteBuffer = fc.map(MapMode.READ_ONLY, 0, fc.size()).load(); System.out.println(byteBuffer.isLoaded()); byte[] result = new byte[(int) fc.size()]; if (byteBuffer.remaining() > 0) { byteBuffer.get(result, 0, byteBuffer.remaining()); } return result; } catch (IOException e) { e.printStackTrace(); throw e; } finally { try { fc.close(); } catch (IOException e) { e.printStackTrace(); } } }
我来回答
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:janesjardin 发表于 2017-01-05 17:23 新手小白,不是很懂。它为什么在这里要定义65535,IP数据包最大值限制长度
引用:JackJiang 发表于 2017-01-05 17:27 我看你的代码很诡异,因为你说的只是需要客户端向服务端传文件,所以就是客户端的编码器跟服务端的解码器对 ...
引用:janesjardin 发表于 2017-01-05 17:38 已经试过在encode里只传byte流,或在encode里没有代码只在opensession里传入文件byte,报错依然一样
引用:一地鼻血 发表于 2017-01-08 11:49 用MINA传文件?都什么时代了,还用pc端时代的im实现方法
引用:janesjardin 发表于 2017-01-18 17:23 这个就是pc项目啊,老项目没办法,现在来不及改
引用:janesjardin 发表于 2017-01-19 10:48 问题已解决,因为没有对上服务端的接收数据格式。 但是现在新的问题是在sessionOpened循环调用session.writ ...
引用:JackJiang 发表于 2017-01-19 11:44 你在sessionOpened里write?这很奇怪吧
引用:janesjardin 发表于 2017-01-19 15:15 嗯,思考了版主的提议并参考了这个帖子,这个问题就解决了 TCP传输下的困境—记在《Mina实现自定协议传 ...
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.154303 second(s), 44 queries , Gzip On.