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多 ...
随机推荐
- 【转】jquery.cookie.js的使用
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...
- Xamarin.Android Binding
0.要绑定的jar库,需要保证编译jar使用的jdk版本,与绑定时xamarin使用的jdk版本一致. 查看编译jar的jdk版本的方法:jar解压后,a.看MANIFEST.MF b. javap ...
- Nodejs:Glob对象
模块Glob: glob主要用处为筛选文件 API样例: var globInstance = new glob.Glob("@(a|a1|b).js",{nonull:true, ...
- angular模块和组件之间传递信息和操作流程的方法(笔记)
angular的模块之间,以及controller.directive等组件之间,是相对独立的,用以实现解耦合. 为实现相互之间传递信息及操作流程,有以下一些机制: 1.事件机制: $scope.$b ...
- 关于MVC4.0中@Styles.Render用法与详解
本文分享于http://keleyi.com/a/bjac/q74dybjc.htm文章,感觉写的蛮好所以就拿过来做笔记了,希望对大家有帮助 最近公司的新项目用了MVC 4.0,接下来一步步把 工作中 ...
- css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数
本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...
- WCF Security(转载)
WCF Security 主要包括 "Transfer Security"."Access Control"."Auditing" 几个部分 ...
- eclipse下SVN同步时忽略target文件夹
直接干货:window-->preferences-->team-->Ignored Resource-->Add Pattern-->新建一个*/target/*--& ...
- win10没有新建文件夹
win10没有新建文件夹 win10系统,电脑点击右键没有新建文件夹选项. 工具/原料 win10 系统台式机 方法/步骤 电脑左下角搜素出输入:cmd 出现以下画面 在命令指示符 ...
- Mac iTerm2命令行快捷操作
control + R 搜索之前输入过的命令 control + U 删除整行命令 control + W 删除光标前面的命令 control + K 删除光标后面的命令