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多 ...
随机推荐
- MySQL:动态开启慢查询日志(Slow Query Log)
前言 在开发中,高效能的程序 也包括 高效能的查询,所以优化SQL也是程序员必要技能之一.要优化就必须要有慢日志记录才可以知道哪些查询慢,然后反向去修改 慢日志设置方式 写入文件 写入数据库 实践操作 ...
- js获取当前时间戳 不需毫秒数
var timestamp = Date.parse(new Date())/1000;
- DataTable/集合 转 Json
前端用的jqueryUI框架获取json格式数据绑定显示表格. 后端通过WebService获取的数据是DataTable. 现将获取DataTable转Json,也支持将数据集合转Json. 一.项 ...
- Mac上安装django
参考:https://docs.djangoproject.com/en/1.9/topics/install/#installing-official-release 升级pip sudo pip ...
- 《阿Q正传》读后感
kindle大法好. 利用坐车的时间阅读完了鲁迅先生写的<阿Q正传>, 心中感慨良多, 记下等以后翻看这些摸不着的回忆吧. 我没看过实体书版, 电子书版的<阿Q正传>注解很详细 ...
- 自定义NSLog
我们在调试程序的时候,往往需要输出一些日志信息,用到NSLog函数,当我们准备发布程序,需要注释掉NSLog代码,这个时候往往会定义一个宏,在调试的时候,会输出日志,在Release正式版本的时候,会 ...
- Issue 5:Hadoop博客系列转载
Alex 的 Hadoop 菜鸟教程: 第1课 hadoop体系介绍 Alex 的 Hadoop 菜鸟教程: 第2课 hadoop 安装教程 (CentOS6 CDH分支 yum方式) Alex 的 ...
- Docker入门简介
Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们的应用和依赖包到一个可一直的容器中,然后 ...
- ios 三种对话框拉伸方法
- JS限制input输入的为数字并且有小数的时候最多保留两位小数
JS限制input用户输入的为数字并且有小数的时候最多保留两位小数,代码如下: html部分: <input type="number" onkeypress="r ...