1,要用到4个jar

2,服务端

package mina.server;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainServer {
private final static Logger log = LoggerFactory
.getLogger(MainServer.class);

private static MainServer mainServer = null;
private SocketAcceptor acceptor = new NioSocketAcceptor();
private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
private int bindPort = 8888;

public static MainServer getInstances() {
if (null == mainServer) {
mainServer = new MainServer();
}
return mainServer;
}

private MainServer() {
chain.addLast("myChin", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory()));
acceptor.setHandler(ServerHandler.getInstances());

acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);
try {
acceptor.bind(new InetSocketAddress(bindPort));
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
MainServer.getInstances();
}

}

package mina.server;

import java.util.Collection;
import java.util.Date;

import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.IoFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import mina.Object.UserInfo;
import mina.client.ClientHandler;

public class ServerHandler extends IoFilterAdapter implements IoHandler {
private final static Logger log = LoggerFactory
.getLogger(ServerHandler.class);

private static ServerHandler samplMinaServerHandler = null;

public static ServerHandler getInstances() {
if (null == samplMinaServerHandler) {
samplMinaServerHandler = new ServerHandler();
}
return samplMinaServerHandler;
}

private ServerHandler() {

}

// 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发
@Override
public void sessionOpened(IoSession session) throws Exception {

session.write("welcome to the chat room !");
}

@Override
public void sessionClosed(IoSession session) {

CloseFuture closeFuture = session.close(true);
closeFuture.addListener(new IoFutureListener<IoFuture>() {
public void operationComplete(IoFuture future) {
if (future instanceof CloseFuture) {
System.out.println("sessionClosed~~~~~~~"+future);
((CloseFuture) future).setClosed();
}
}
});
}

//服务器接收到数据
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
if (message instanceof UserInfo) {
UserInfo text = (UserInfo) message;
System.out.println("服务器接收到从客户端的姓名:"+text.getName());
System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());
}else{

System.out.println(message);
}

// 拿到所有的客户端Session
Collection<IoSession> sessions = session.getService().getManagedSessions().values();
// 向所有客户端发送数据
for (IoSession sess : sessions) {
UserInfo text = (UserInfo) message;
sess.write(new Date()+":服务器已收到 "+text.getName());
}
System.out.println("客户端数量: "+sessions.size());

}

@Override
public void exceptionCaught(IoSession arg0, Throwable arg1)
throws Exception {

}

// 当消息传送到客户端后触发
@Override
public void messageSent(IoSession arg0, Object message) throws Exception {
System.out.println("当消息传送到客户端后触发 "+message );
}

// 当一个新客户端连接后触发此方法.
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println(" 当一个新客户端连接后触发此方法. " );
//session.write("welcome to the chat room !");
}

// 当连接空闲时触发此方法.
@Override
public void sessionIdle(IoSession session, IdleStatus arg1) throws Exception {
System.out.println(" 当连接空闲时触发此方法 " );
//session.close(true);
}

}

3,客户端

package mina.client;

import java.net.InetSocketAddress;

import mina.server.MainServer;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainClient {
private final static Logger log = LoggerFactory
.getLogger(MainServer.class);

private static MainClient mainClient = null;
NioSocketConnector connector = new NioSocketConnector();
DefaultIoFilterChainBuilder chain = connector.getFilterChain();

public static MainClient getInstances() {
if (null == mainClient) {
mainClient = new MainClient();
}
return mainClient;
}

private MainClient() {

chain.addLast("myChin", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory()));//注册

connector.setHandler(ClientHandler.getInstances());//build

connector.setConnectTimeout(30);//连接超时

ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
8888));//连接

cf.awaitUninterruptibly();//等待

}

public static void main(String args[]) {
MainClient.getInstances();
}

}

package mina.client;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import mina.Object.UserInfo;

public class ClientHandler extends IoHandlerAdapter {
private final static Logger log = LoggerFactory
.getLogger(ClientHandler.class);

private static ClientHandler samplMinaClientHandler = null;
public static ClientHandler getInstances() {
if (null == samplMinaClientHandler) {
samplMinaClientHandler = new ClientHandler();
}
return samplMinaClientHandler;
}

private ClientHandler() {

}

//当连接打开是调用
@Override
public void sessionOpened(IoSession session) throws Exception {

//session.write("客户端与服务器的会话打开了……");
UserInfo text=new UserInfo();
text.setName("梅竹~~~~寒香");
text.setQQNum("972341215");
session.write(text);
}

@Override
public void sessionClosed(IoSession session) {

System.out.println("sessionClosed~~~~~~~"+session);

}

//当接收了一个消息时调用;
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {

System.out.println("xxy~~~~~~~"+message);
session.write("^^^^^^^^^^^^");

}

//当一个消息被(IoSession#write)发送出去后调用;
@Override
public void messageSent(IoSession session, Object obj) throws Exception {

//session.write("GGGGGGGGGGGGGGGG");
System.out.println("客户端已经向服务器发送了:"+(String)obj+"uuuuuuuuu"+session);
}
}

4,测试

先run服务端,再run客户端

OVER!!!

mina通信 demo的更多相关文章

  1. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

  2. 通信服务器群集——跨服务器通信Demo(源码)

    对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...

  3. NIO框架之MINA源码解析(五):NIO超级陷阱和使用同步IO与MINA通信

    1.NIO超级陷阱 之所以说NIO超级陷阱,就是因为我在本系列开头的那句话,因为使用缺陷导致客户业务系统瘫痪.当然,我对这个问题进行了很深的追踪,包括对MINA源码的深入了解,但其实之所以会出现这个问 ...

  4. VC++ 6.0 C8051F340 USB PC侧通信 Demo

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

  5. Mina入门demo

    初识Mina,简要记录理解内容和实现demo. 这里先简述一下BIO和NIO的区别: 同步阻塞IO(BIO):一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任 ...

  6. 基于Java Mina 通信框架的JT/T809转发服务器设计

    Apache MINA 是 Apache 组织的一个开源项目,为开发高性能和高可用性的网络应用程序提供了非常便利的框架. 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础sock ...

  7. Netty4 学习笔记之一:客户端与服务端通信 demo

    前言 因为以前在项目中使用过Mina框架,感受到了该框架的强大之处.于是在业余时间也学习了一下Netty.因为Netty的主要版本是Netty3和Netty4(Netty5已经被取消了),所以我就直接 ...

  8. ESFramework Demo -- P2P通信Demo(附源码)

    现在我们将在ESFramework Demo -- 文件传送Demo 的基础上,使用ESPlus提供的第四个武器,为其增加P2P通信的功能.在阅读本文之前,请务必先掌握ESFramework 开发手册 ...

  9. 轻量级通信引擎StriveEngine —— C/S通信demo(附源码)

    前段时间,有几个研究ESFramework的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关系.也不 ...

随机推荐

  1. android 移动网络实时抓包

    2G.3G环境,那就必须root进去tcpdump 方式抓. 准备: 一.root CF-auto-root: http://autoroot.chainfire.eu/ 需要清理全部数据,注意备份 ...

  2. selenium 常见面试题以及答案(Java版)

    1.怎么 判断元素是否存在? 判断元素是否存在和是否出现不同, 判断是否存在意味着如果这个元素压根就不存在, 就会抛出NoSuchElementException 这样就可以使用try catch,如 ...

  3. JSP页面JSTL提供的函数标签EL表达式操作字符串的方法

    首先在jsp页面导入标签<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions&quo ...

  4. c++队列基本功能

    #include<string>#include<assert.h>#include<iostream>typedef int status;#define OK ...

  5. 更改WAS Profiles的概要文件的server1的SDK版本

    WebSphere只能使用IBM JDK 哦,不能使用sun的JDK哦.不过如果只是改jdk的版本的话可以参考如下步骤:(以集群为例,假设具有管理节点Dmgr01,应用概要AppSrv01) 1. 确 ...

  6. OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

    我在之前的博客中曾提到过,OpenGL中坐标是采用行向量表示的,与之相对应的是,在矩阵变换中使用的是变换矩阵的转置,并且使用的是后乘的方式.本文直接使用下面的代码来及其后的图示来解释函数 p,li { ...

  7. C++开始前篇,深入编译链接(补充2)

    在开始链接之前,我们先了解几个概念: 一>符号的概念. 我们知道,链接的最重要的是"对符号的重定位",而且上面提到了符号表,那什么是符号呢,在链接中,我们将函数和变量统称为符 ...

  8. 用gulp构建你的前端项目

    前言 前端技术发展日新月异,随着模块化.组件化的提出,前端变得越来越复杂,静态资源越来越多,那么对静态资源的处理,如压缩,合并,去掉调试信息.. 如果还是人工去处理,效率非常之低且还容易出错,于是自动 ...

  9. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  10. Notepad++正则表达式语法

    \   转义字符  如:要使用 “\” 本身, 则应该使用“\\” \t  Tab制表符  注:扩展和正则表达式都支持 \r  回车符CR   注:扩展支持,正则表达式不支持 \n  换行符LF   ...