SeverTest.java
/**
* Copyright TopScientific Systems Ltd. 2005-2007
* All right reserved.
*/
package org.apache.mina.mytest;
import java.net.InetSocketAddress;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.IoAcceptorConfig;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
/**
* @author zkchen
*
*/
public class SeverTest {
private static final int PORT = 1234;
public static void main(String[] args) throws Exception {
IoAcceptor acceptor = new SocketAcceptor();
IoAcceptorConfig config = new SocketAcceptorConfig();
DefaultIoFilterChainBuilder chain = config.getFilterChain();
// Add SSL filter if SSL is enabled.
chain.addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory()));
addLogger(chain);
// Bind
acceptor.bind(new InetSocketAddress(PORT), new EchoProtocolHandler(
), config);
System.out.println("Listening on port " + PORT);
}
private static void addLogger(DefaultIoFilterChainBuilder chain)
throws Exception {
chain.addLast("logger", new LoggingFilter());
System.out.println("Logging ON");
}
}
EchoProtocolHandler.java
package org.apache.mina.mytest;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Random;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.TransportType;
import org.apache.mina.filter.SSLFilter;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EchoProtocolHandler extends IoHandlerAdapter {
private static final Logger log = LoggerFactory
.getLogger(EchoProtocolHandler.class);
private Hashtable<IoSession, String> clients = new Hashtable<IoSession, String>();
private Random random = new Random();;
private static int user = 0;
public EchoProtocolHandler() {
super();
}
public void sessionCreated(IoSession session) {
if (session.getTransportType() == TransportType.SOCKET) {
((SocketSessionConfig) session.getConfig())
.setReceiveBufferSize(2048);
}
session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
// We're going to use SSL negotiation notification.
session.setAttribute(SSLFilter.USE_NOTIFICATION);
// session.write("create a session");
}
public void sessionOpened(IoSession session) {
// UserInfo userInfo = new UserInfo();
// userInfo.isValid = false;
// session.setAttachment(userInfo);
String userName = "client" + (++user);
session.write("session open");
clients.put(session, userName);
session.write("LOGIN OK");
broadcast("The user " + user + " has joined the chat session. "
+ this.getNumberOfUsers());
log.info("a new client connected,but didn't join yet!"); // 通话session
// 打开以后促发的事件处理
this.sendMessage(session);
}
public void sessionClosed(IoSession session) {
log.info("a client closed,and now count is : "
+ this.getNumberOfUsers()); // 通话session
String user = clients.get(session);
clients.remove(session);
broadcast("The user " + user + " has left the chat session.");
// 关闭以后促发的事件处理
}
public void sessionIdle(IoSession session, IdleStatus status) {
log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)
+ " ***");
// session.write("sessionidle");
}
public void exceptionCaught(IoSession session, Throwable cause) {
cause.printStackTrace();
session.close();
}
public void messageReceived(IoSession session, Object message)
throws Exception {
if (!(message instanceof ByteBuffer)) {
return;
}
ByteBuffer rb = (ByteBuffer) message;
// Write the received data back to remote peer
ByteBuffer wb = ByteBuffer.allocate(rb.remaining());
wb.put(rb);
wb.flip();
}
public void messageSent(IoSession session, Object message) {
log.info(">>>>>this is server ,sent the message to client: ");
log.info("messageSent succful");
// 发送成功以后会调用这里的函数
// message 为messageReceived 函数中 write 发送的消息
// 绝对不要在这里用write 不然要死循环的
}
public void sendMessage(IoSession session) {
int num;
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num = random.nextInt();
Iterator iter = clients.keySet().iterator();
while (iter.hasNext()) {
IoSession s = (IoSession) iter.next();
if (s.isConnected()) {
s.write("BROADCAST OK " + num);
}
}
}
}
public void broadcast(String message) {
//
// Iterator it=
// while(it.hasNext())
// { System.out.println(clients.get(it.next()));}
Iterator iter = clients.keySet().iterator();
while (iter.hasNext()) {
IoSession s = (IoSession) iter.next();
if (s.isConnected()) {
s.write("BROADCAST OK " + message);
}
}
}
public int getNumberOfUsers() {
return clients.size();
}
}
ClientTest.java
/**
* Copyright TopScientific Systems Ltd. 2005-2007
* All right reserved.
*/
package org.apache.mina.mytest;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoConnector;
import org.apache.mina.transport.socket.nio.SocketConnector;
import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
/**
* @author zkchen
*
*/
public class ClientTest {
//private IoSession session;
public ClientTest() {
IoConnector ioConnector = new SocketConnector();
SocketAddress address = new InetSocketAddress("localhost",1234);
ConnectFuture future1 = ioConnector.connect(address ,new ClientHandler() , new SocketConnectorConfig());
if( ! future1.isConnected() )
{
System.out.println("full is connected");
}
future1.join();
if( ! future1.isConnected() )
{
System.out.println("hsa connected");
}
System.out.println(future1);
System.out.println(future1.getSession());
}
public static void main(String [] args){
new ClientTest();
}
}
ClientHandler.java
package org.apache.mina.mytest;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoFilter;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
/* *
* @author The Apache Directory Project (mina-dev@directory.apache.org)
* @version $Rev$, $Date$
*/
public class ClientHandler extends IoHandlerAdapter {
private static IoFilter LOGGING_FILTER = new LoggingFilter();
private static IoFilter CODEC_FILTER = new ProtocolCodecFilter(
new TextLineCodecFactory());
public void sessionCreated(IoSession session) throws Exception {
session.getFilterChain().addLast("codec", CODEC_FILTER);
session.getFilterChain().addLast("logger", LOGGING_FILTER);
}
public void sessionOpened(IoSession session) throws Exception {
session.write("client open");
}
public void messageReceived(IoSession session, Object message)
throws Exception {
if (!(message instanceof ByteBuffer)) {
return;
}
ByteBuffer rb = (ByteBuffer) message;
// Write the received data back to remote peer
ByteBuffer wb = ByteBuffer.allocate(rb.remaining());
wb.put(rb);
System.out.println(wb.toString());
wb.flip();
}
public void messageSent(IoSession session, Object message) {
// session.write("hello");
// 发送成功以后会调用这里的函数
// message 为messageReceived 函数中 write 发送的消息
// 绝对不要在这里用write 不然要死循环的
}
public void sessionClosed(IoSession session) throws Exception {
}
}