【在线等】MINA2.0 Iosession.setAttribute("name","value")疑问 用的是MINA2.0 M1版本,我现在是想把客户端的IoSessio.setAttribute("name","value")这个属性传递到服务端去,也就是要在服务端用IoSession.getAttribute("name");取到value值。现在的情况是获取不到,为null。请问各位知道的兄弟姐妹们。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //服务端代码import java.io.IOException;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.common.IdleStatus;import org.apache.mina.common.IoAcceptor;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.LineDelimiter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MyServer { public static void main(String args[]){ //IoService IoAcceptor acceptor = new NioSocketAcceptor(10); //IoSessionConfig acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); //过滤器IoFilter acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())) ); //acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory())); acceptor.setHandler(new MyIoHandler());//业务逻辑 try { acceptor.bind(new InetSocketAddress(9123));//非阻塞nio } catch (IOException e) { e.printStackTrace(); } }}//服务端处理类代码import org.apache.mina.common.IoHandlerAdapter;import org.apache.mina.common.IoSession;public class MyIoHandler extends IoHandlerAdapter{ public void sessionCreated(IoSession session){ System.out.println("服务端::::::sessionCreated:::::::"+session.getService().getManagedSessionCount()); } /** * 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来 * 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。 */ public void sessionOpened(IoSession session) { System.out.println("服务端:::::sessionOpened:::::::"); } public void messageReceived(IoSession session,Object message){ //IoService ioservice = session.getService(); System.out.println("count:::::"+session.getAttribute("name")); String str = message.toString(); System.out.println("The Message receiced is ["+str+"]"+" sessionName::"+session.getAttribute("name")); if(str.endsWith("quit")){ session.close(); return; } } }//客户端代码import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.common.ConnectFuture;import org.apache.mina.common.IoConnector;import org.apache.mina.common.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.LineDelimiter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.filter.logging.LogLevel;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MyClient { public static void main(String [] args){ IoConnector connector = new NioSocketConnector(); connector.setConnectTimeout(30); LoggingFilter lf = new LoggingFilter(); lf.setMessageSentLogLevel(LogLevel.INFO); connector.getFilterChain().addLast("logger", lf); connector.getFilterChain().addLast("codec",new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())) ); connector.setHandler(new ClientIoHandler("你好!\r\n 大家好!")); ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.1.107",9123)); cf.awaitUninterruptibly(); // Wait until the connection attempt is finished. IoSession session = cf.getSession(); session.setAttribute("name", "value"); for(int i=0;i<1000;i++){ if(session.isClosing()){ cf.cancel(); connector.dispose(); session = null; break; }else{ session.write(" "+System.currentTimeMillis()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}//客户端处理类代码package sample;import org.apache.mina.common.IdleStatus;import org.apache.mina.common.IoHandlerAdapter;import org.apache.mina.common.IoSession;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class ClientIoHandler extends IoHandlerAdapter{ private final static Logger LOGGER = LoggerFactory.getLogger(ClientIoHandler.class); private final String values; public ClientIoHandler(String values) { this.values = values; } /** * 这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候 * 调用,但要注意此时TCP 连接并未建立,此方法仅代表字面含义,也就是连接的对象 * IoSession 被创建完毕的时候,回调这个方法。 * 对于UDP 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的。 */ public void sessionCreated(IoSession session){ System.out.println("客户端::::sessionCreated:::::::"+session.getService().getManagedSessionCount()); // session.setAttribute("name", "client"+session.getId()); } /** * 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来 * 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。 */ public void sessionOpened(IoSession session) { System.out.println("客户端::::sessionOpened:::::::"); } /** * 这个方法在IoSession 的通道进入空闲状态时调用,对于UDP 协议来说,这个方法始终不会 * 被调用。 */ public void sessionIdle(IoSession session, IdleStatus status){ System.out.println("sessionIdle:::::::::::::"); } /** * 这个方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession。 */ public void exceptionCaught(IoSession session, Throwable cause){ } /** * 接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message 是一个 * IoBuffer 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。 */ public void messageReceived(IoSession session ,Object message){ System.out.println(message); } /** * 当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后, * 也就是说发送消息是不能用这个方法的。 */ public void messageSent(IoSession session, Object message){ System.out.println("sent:::::::::::::"+System.currentTimeMillis()); } /** * 对于TCP 来说,连接被关闭时,调用这个方法。 * 对于UDP 来说,IoSession 的close()方法被调用时才会毁掉这个方法。 */ public void sessionClosed(IoSession session){ System.out.println("Closed:::::::::::::;"); } } 我做了个程序抓取网页源码,结果汉字都成了“区”这样的短码,怎么改回汉字? 应用Socket的问题?? java中实数比较问题 两道面试题! 字节流和字符流 内存释放的问题!!! java实参的变量命名应该用什么参数阿? 以e为底的对数ln的函数是什么呀? 简单! 全部分数138问2000 server下设置jdk(附带已经查询过的帖子) 多线程轮流作业输出出错!帮忙帮忙~ 怎么样设计自己的Java命令?
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MyServer { public static void main(String args[]){
//IoService
IoAcceptor acceptor = new NioSocketAcceptor(10);
//IoSessionConfig
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//过滤器IoFilter
acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue()))
);
//acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
acceptor.setHandler(new MyIoHandler());//业务逻辑
try {
acceptor.bind(new InetSocketAddress(9123));//非阻塞nio
} catch (IOException e) {
e.printStackTrace();
}
}
}//服务端处理类代码
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;public class MyIoHandler extends IoHandlerAdapter{
public void sessionCreated(IoSession session){
System.out.println("服务端::::::sessionCreated:::::::"+session.getService().getManagedSessionCount());
}
/**
* 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
* 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。
*/
public void sessionOpened(IoSession session) {
System.out.println("服务端:::::sessionOpened:::::::");
}
public void messageReceived(IoSession session,Object message){
//IoService ioservice = session.getService();
System.out.println("count:::::"+session.getAttribute("name"));
String str = message.toString();
System.out.println("The Message receiced is ["+str+"]"+" sessionName::"+session.getAttribute("name"));
if(str.endsWith("quit")){
session.close();
return;
}
}
}
//客户端代码
import java.net.InetSocketAddress;
import java.nio.charset.Charset;import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoConnector;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LogLevel;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MyClient { public static void main(String [] args){
IoConnector connector = new NioSocketConnector();
connector.setConnectTimeout(30);
LoggingFilter lf = new LoggingFilter();
lf.setMessageSentLogLevel(LogLevel.INFO);
connector.getFilterChain().addLast("logger", lf);
connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue()))
);
connector.setHandler(new ClientIoHandler("你好!\r\n 大家好!"));
ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.1.107",9123));
cf.awaitUninterruptibly(); // Wait until the connection attempt is finished.
IoSession session = cf.getSession();
session.setAttribute("name", "value");
for(int i=0;i<1000;i++){
if(session.isClosing()){
cf.cancel();
connector.dispose();
session = null;
break;
}else{
session.write(" "+System.currentTimeMillis());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}//客户端处理类代码
package sample;import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ClientIoHandler extends IoHandlerAdapter{
private final static Logger LOGGER = LoggerFactory.getLogger(ClientIoHandler.class);
private final String values;
public ClientIoHandler(String values) {
this.values = values;
}
/**
* 这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候
* 调用,但要注意此时TCP 连接并未建立,此方法仅代表字面含义,也就是连接的对象
* IoSession 被创建完毕的时候,回调这个方法。
* 对于UDP 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的。
*/
public void sessionCreated(IoSession session){
System.out.println("客户端::::sessionCreated:::::::"+session.getService().getManagedSessionCount());
// session.setAttribute("name", "client"+session.getId());
}
/**
* 这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
* 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。
*/
public void sessionOpened(IoSession session) {
System.out.println("客户端::::sessionOpened:::::::");
} /**
* 这个方法在IoSession 的通道进入空闲状态时调用,对于UDP 协议来说,这个方法始终不会
* 被调用。
*/
public void sessionIdle(IoSession session, IdleStatus status){
System.out.println("sessionIdle:::::::::::::");
}
/**
* 这个方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession。
*/
public void exceptionCaught(IoSession session, Throwable cause){
}
/**
* 接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message 是一个
* IoBuffer 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。
*/
public void messageReceived(IoSession session ,Object message){
System.out.println(message);
}
/**
* 当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后,
* 也就是说发送消息是不能用这个方法的。
*/
public void messageSent(IoSession session, Object message){
System.out.println("sent:::::::::::::"+System.currentTimeMillis());
}
/**
* 对于TCP 来说,连接被关闭时,调用这个方法。
* 对于UDP 来说,IoSession 的close()方法被调用时才会毁掉这个方法。
*/
public void sessionClosed(IoSession session){
System.out.println("Closed:::::::::::::;");
}
}