java socket 多线程通讯 使用mina作为服务端
客户端代码不变,参照 http://www.cnblogs.com/Westfalen/p/6251473.html
服务端代码如下:
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- /**
- * 使用mina作为服务器进行socket通讯
- *
- * 需要jar包: mina-core-2.0.16.jar, slf4j-api-1.7.21.jar
- * jar包下载地址 : http://mina.apache.org/downloads-mina.html
- *
- */
- public class MinaServer {
- public static void main(String[] args) {
- try {
- // 4步操作
- // 1.新建 NioSocketAcceptor 事例对象
- NioSocketAcceptor acceptor = new NioSocketAcceptor();
- // 2.设置消息处理对象
- acceptor.setHandler(new MyServerHandler());
- // 3.设置消息解码器
- acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyTextLineFactory()));// acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
- // //设置idle时长
- // 4.绑定端口开启服务
- acceptor.bind(new InetSocketAddress(9999));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 专门处理消息的类,实现网络连接和消息处理的解耦
- */
- class MyServerHandler extends IoHandlerAdapter {
- /** 异常时候的处理 */
- @Override
- public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
- System.out.println("exceptionCaught");
- }
- /** 收到消息 */
- @Override
- public void messageReceived(IoSession session, Object message) throws Exception {
- System.out.println("messageReceived " + message);
- // session.write("reply " + message); //收到消息就马上把消息回送给客户端
- }
- /** 发送消息 */
- @Override
- public void messageSent(IoSession session, Object message) throws Exception {
- System.out.println("messageSent " + message);
- }
- /** 通讯闲置时候的处理 */
- @Override
- public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
- System.out.println("sessionIdle");
- }
- }
- package de.bvb.server;
- import java.nio.charset.Charset;
- import java.nio.charset.CharsetEncoder;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
- import org.apache.mina.filter.codec.ProtocolCodecFactory;
- import org.apache.mina.filter.codec.ProtocolDecoder;
- import org.apache.mina.filter.codec.ProtocolDecoderOutput;
- import org.apache.mina.filter.codec.ProtocolEncoder;
- import org.apache.mina.filter.codec.ProtocolEncoderOutput;
- public class MyTextLineFactory implements ProtocolCodecFactory {
- private ProtocolEncoder encoder;
- private ProtocolDecoder decoder;
- public MyTextLineFactory() {
- encoder = new MyTextLineEncoder();
- decoder = new MyCumulativeProtocolDecoder();
- }
- @Override
- public ProtocolEncoder getEncoder(IoSession session) throws Exception {
- return encoder;
- }
- @Override
- public ProtocolDecoder getDecoder(IoSession session) throws Exception {
- return decoder;
- }
- }
- class MyTextLineEncoder implements ProtocolEncoder {
- @Override
- public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
- // 编码格式
- CharsetEncoder charsetEncoder = (CharsetEncoder) session.getAttribute("encoder");
- if (charsetEncoder == null) {
- charsetEncoder = Charset.defaultCharset().newEncoder();
- session.setAttribute("encoder", charsetEncoder);
- }
- String value = (message == null ? "" : message.toString());
- IoBuffer buffer = IoBuffer.allocate(value.length()).setAutoExpand(true);
- buffer.putString(value, charsetEncoder);
- buffer.flip();
- out.write(buffer);
- }
- @Override
- public void dispose(IoSession session) throws Exception {
- }
- }
- class MyCumulativeProtocolDecoder extends CumulativeProtocolDecoder {
- @Override
- protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
- int startPosition = in.position();
- while (in.hasRemaining()) {
- byte b = in.get();
- if (b == '\n') {
- int currentPosition = in.position();
- int limit = in.limit();
- in.position(startPosition);
- in.limit(currentPosition);
- IoBuffer buffer = in.slice();
- byte[] dest = new byte[buffer.limit()];
- buffer.get(dest);
- String str = new String(dest);
- out.write(str);
- in.position(currentPosition);
- in.limit(limit);
- return true;
- }
- }
- in.position(startPosition);
- return false;
- }
- }
java socket 多线程通讯 使用mina作为服务端的更多相关文章
- java Socket Tcp示例三则(服务端处理数据、上传文件)
示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...
- java socket 多线程通讯
1.目录结构 2.Server.java 代码 package de.bvb.server; import java.net.ServerSocket; import java.net.Socket; ...
- java socket 多线程网络传输多个文件
http://blog.csdn.net/njchenyi/article/details/9072845 java socket 多线程网络传输多个文件 2013-06-10 21:26 3596人 ...
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Mina TCP服务端客户端 示例
服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing
最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...
随机推荐
- finally类
finally叫做最后的执行快,什么是最后的执行快?他的意思是这样的 他是写在try catch 的后面但是只能写一个,他设计这个finally的意思就是,如果try里面出错肯定会往陷阱里 面跑.没有 ...
- Java 中的值传递和参数传递
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...
- css3知识
一.box-sizing 属性 规定两个并排的带边框的框 二.align-items (适用于父类容器上) 设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式. 值: flex-start:弹性盒子 ...
- JMeter学习-035-JMeter调试工具之二---Debug PostProcessor
前文 JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server讲述了HTTP镜像服务器在调试请求入参时的实例应用.此文我们讲述另一种测试脚本调试工具的使用. 前置处 ...
- Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...
- C++学习笔记 宏 const 内联 枚举
宏, const变量, 内联, 枚举 宏 宏定义: 宏即宏替换,在C语言源程序中允许用一个标识符来表示一个字符串,称为宏,关键字 define,在所有使用到宏的地方都只是直接的替换而不做任何类型检查 ...
- 限制EditText最多输入多少汉字
mInputEditText.setFilters(new InputFilter[]{new InputLengthFilter(MAX_INPUT_SIZE)}); public class In ...
- Android 使用Socket进行通信(Android)
一.服务器程序 服务器程序需要在PC上运行,该程序比较的简单,因此不需要建立Android项目,直接定义一个JAVA类,并且运行该类即可.它仅仅建立ServerSocket监听,并使用Socket获取 ...
- mysql 工具箱
创建测试数据 存储过程: delimiter // create procedure sp_generate_data() begin ; do set @created_time := date_a ...
- Spring操作指南-AOP基本示例(基于XML)