`
wwwzhouhui
  • 浏览: 361438 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

socket通讯和mina应用

阅读更多

 

这几天看了一下MINA,学习了一下mina的技术。写了一些例子从普通的SOCKET通讯到MINA通讯,已经SOCKET client和mina做服务端通讯。下面贴出具体的代码

   1.普通socket通讯

      client.java

 

package test.socket;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/***********************************************************************   
 *   
 *   client.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   4:07:22 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class client {
	private static final Log log = LogFactory.getLog(client.class);
	private static int i = 0;
	private Socket s;
	private ObjectOutputStream out;
	private ObjectInputStream in;
	public client() throws IOException {
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		client c = new client();
		c.talk();
	}

	/**
	 *   发送消息
	 * @param out
	 */
	public void sendMessage(Socket s) {
		try {
			 out = new ObjectOutputStream(s.getOutputStream());
			Message m = new Message();
			m.setStatus(i);
			m.setType(3);
			m.setMsgBody("hello client");
			i++;
			out.writeObject(m);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public void receiveMessage(Socket s) {
		try {
			 in = new ObjectInputStream(s.getInputStream());
				Message m;
				m = (Message) in.readObject();
					log.info("message::::" + m.getStatus() + "::" + m.getType()
							+ "::" + m.getMsgBody());;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void talk() throws Exception {
		while (true) {
			try {
				s = new Socket("localhost", 9988);
				sendMessage(s);
				receiveMessage(s);
				out.close();
				in.close();
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch(Exception e){
				e.printStackTrace();
			}
			finally {
		         try{
		           if(s!=null)s.close();  //断开连接
		         }catch (IOException e) {e.printStackTrace();}
		      }
		}
	}
}

    功能客户端发送和接受服务端消息,休息5秒后在重复发送消息和接受消息

    server.java

 

package test.socket;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/***********************************************************************   
 *   
 *   Server.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   4:01:54 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class Server {
	private static final Log log = LogFactory.getLog(Server.class);
	private ServerSocket socket;
	private ObjectInputStream in;
	private ObjectOutputStream out;
	private static int i = 0;
	public Server() throws Exception{
		socket= new ServerSocket(9988);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		Server  s =new Server();
		log.info("server is start");
		s.talk();
		}
	
	/**
	 * 接受消息
	 * @param s
	 */
	public void receiveMessage(Socket s) {
		try {
			 in = new ObjectInputStream(s.getInputStream());
				Message m;
				m = (Message) in.readObject();
					log.info("message::::" + m.getStatus() + "::" + m.getType()
							+ "::" + m.getMsgBody());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 *   发送消息
	 * @param out
	 */
	public void sendMessage(Socket s) {
		try {
		    out = new ObjectOutputStream(s.getOutputStream());
			Message m = new Message();
			m.setStatus(i);
			m.setType(3);
			m.setMsgBody("hello server");
			i++;
			out.writeObject(m);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void talk()throws Exception{
		while(true){
			Socket socket=null;
			 try {
				socket = this.socket.accept();  //等待客户连接
				 receiveMessage(socket);
				 sendMessage(socket);
				 out.close();
				 in.close();
			} catch (RuntimeException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e) {
		         e.printStackTrace();
		      }
			finally {
		         try{
		           if(socket!=null)socket.close();  //断开连接
		         }catch (IOException e) {e.printStackTrace();}
		      }
		}
	}

}

    服务端接收消息后发送消息给客户端,之后进入柱塞状态等待新的连接

    message.java

 

package test.socket;

import java.io.Serializable;

public class Message implements Serializable {
	private int type;    
    private int status;    
    private String msgBody;
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
	public String getMsgBody() {
		return msgBody;
	}
	public void setMsgBody(String msgBody) {
		this.msgBody = msgBody;
	} 
}

   后启动server.java 和client.JAVA 看运行结果控制台打印出相应收发数据

  2 mina 传递字符串

   先介绍一下MINA传递数据的方式.mina主要是通过1建立连接,2过滤 3.IoHandler业务处理  这3块

   常用到SocketAccepter 相对于ServerSocket ,SocketConnector 相对于Socket 客户端

   然后就多了一个数据过滤iofilter.最后的IoHandler  就是业务逻辑处理

   MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

 

   一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):

   void exceptionCaught (IoSession session, Throwable cause)
                   当接口中其他方法抛出异常未被捕获时触发此方法
   void messageReceived (IoSession session, Object message)
                   当接收到客户端的请求信息后触发此方法.
   void messageSent (IoSession session, Object message)
                   当信息已经传送给客户端后触发此方法.
   void sessionClosed (IoSession session)
                   当连接被关闭时触发,例如客户端程序意外退出等等.
   void sessionCreated (IoSession session)
                   当一个新客户端连接后触发此方法.
   void sessionIdle (IoSession session, IdleStatus status)
                   当连接空闲时触发此方法.

   void sessionOpened (IoSession session)
                   当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

详细信息可以参考相关的文档

 

    HelloWorldClient.java (客户端连接和过滤,客户端启动类)

 

package test.simple;

import java.net.InetSocketAddress;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/***********************************************************************   
 *   
 *   HelloWorldClient.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   2:09:31 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class HelloWorldClient {
	private static final Log log = LogFactory.getLog(HelloWorldClient.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		  //实际应用中,这里可以生成一个线程来监听             
        // Create TCP/IP connector.  
        NioSocketConnector connector = new NioSocketConnector();  
          
        // 创建接收数据的过滤器         
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
          
        //设定这个过滤器将一行一行(/r/n)的读取数据         
        chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));  
          
        //设定服务器端的消息处理器:一个SamplMinaServerHandler对象,        
        connector.setHandler(new HelloWorldClientHandler());  
  
          
        //连结到服务器:  
        try  
        {  
            ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988)); 
            cf.awaitUninterruptibly();  
            cf.getSession().getCloseFuture().awaitUninterruptibly(); 
            connector.broadcast("ddfdf");
        }  
        catch(Exception e)  
        {  
            connector.dispose();  
            log.error("未能连接到服务器");  
        }  

	}

}
    HelloWorldClientHandler.java(客户端业务逻辑处理类)

 

package test.simple;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/***********************************************************************   
 *   
 *   HelloWorldClientHandler.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   2:04:26 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class HelloWorldClientHandler extends IoHandlerAdapter {
	// 当一个客端端连结进入时
	private static final Log log = LogFactory
			.getLog(HelloWorldServerHandler.class);

	public void sessionOpened(IoSession session) throws Exception {
		log.info("server  : " + session.getRemoteAddress());
	}

	// 当一个客户端关闭时
	public void sessionClosed(IoSession session) {
		log.info("one server  Disconnect !");
	}

	// 当客户端发送的消息到达时:
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String s = (String) message;
		// Write the received data back to remote peer
		log.info("收到服务端发来的消息: " + s);
		//session.write("zzzzz");
	}

	// 发送消息给客户机器
	public void messageSent(IoSession session,Object message) throws Exception {
		log.info("发送消息给服务端: " + message);
	}

	// 发送消息异常
	public void exceptionCaught(IoSession session, Throwable cause) {
		session.close();
	}

	// //sessiong空闲
	// public void sessionIdle( IoSession session, IdleStatus status )
	// {
	// }
	// 创建 session
	public void sessionCreated(IoSession session) {

	}
}

    HelloWorldServer.java(服务端连接和过滤类,服务端启动类)

 

package test.simple;

import java.net.InetSocketAddress;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/*******************************************************************************
 * 
 * HelloWorldServer.java
 * 
 * @copyright Copyright: 2009-2012
 * @creator 周辉<br/>
 * @create-time Aug 21, 2009 2:01:00 PM
 * @revision $Id: *
 ******************************************************************************/
public class HelloWorldServer {
	private static final Log log = LogFactory.getLog(HelloWorldServer.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 创建一个非阻塞的Server端Socket,用NIO
			NioSocketAcceptor acceptor = new NioSocketAcceptor();

			// 创建接收数据的过滤器
			DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

			// 设定这个过滤器将一行一行(/r/n)的读取数据
			chain.addLast("codec", new ProtocolCodecFilter(
					new TextLineCodecFactory()));

			// 设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
			acceptor.setHandler(new HelloWorldServerHandler());

			// 服务器端绑定的端口
			int bindPort = 9988;

			// 绑定端口,启动服务器
			acceptor.bind(new InetSocketAddress(bindPort));
			log.info("Mina Server is Listing on:= " + bindPort);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

    HelloWorldServerHandler.java(服务端业务处理类)

 

package test.simple;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/*******************************************************************************
 * 
 * HelloWorldServerHandler.java
 * 
 * @copyright Copyright: 2009-2012
 * @creator 周辉<br/>
 * @create-time Aug 21, 2009 1:45:52 PM
 * @revision $Id: *
 ******************************************************************************/
public class HelloWorldServerHandler extends IoHandlerAdapter {
	// 当一个客端端连结进入时
	private static final Log log = LogFactory
			.getLog(HelloWorldServerHandler.class);

	public void sessionOpened(IoSession session) throws Exception {
		log.info("incomming client : " + session.getRemoteAddress());
	}

	// 当一个客户端关闭时
	public void sessionClosed(IoSession session) {
		log.info("one Clinet Disconnect !");
	}

	// 当客户端发送的消息到达时:
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String s = (String) message;
		// Write the received data back to remote peer
		log.info("收到客户机发来的消息: " + s);
		session.write("hello client");
	}

	// 发送消息给客户机器
	public void messageSent(IoSession session, Object message) throws Exception {
		log.info("发送消息给客户端: " + message);
	}

	// 发送消息异常
	public void exceptionCaught(IoSession session, Throwable cause) {
		session.close();
	}

	// //sessiong空闲
	// public void sessionIdle( IoSession session, IdleStatus status )
	// {
	// }
	// 创建 session
	public void sessionCreated(IoSession session) {

	}
}

    好了客户端服务端代码都有了可以测试了,启动HelloWorldServer.java 和HelloWorldClient.java 可以看到客户服务端收发消息了。

   将HelloWorldClientHandler.java 中

// 当客户端发送的消息到达时:
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        String s = (String) message;
        // Write the received data back to remote peer
        log.info("收到服务端发来的消息: " + s);
        session.write("zzzzz");
    }

session.write("zzzzz"); 放开后运行,客户端服务端不挺得收发消息。

 原因分析。我们知道messageReceived 方法是“当接收到客户端的请求信息后触发此方法 ” 客户端首先发起消息 给服务端,服务端 messageReceived收到消息后又写数据了,客户端messageReceived消息收到数据也写数据,这样就形成

客户----服务-----客户---服务。。。。。。。。。不停的运行了。

我们想可不可以用MINA 做服务端,普通 socket做客户端呢?答案是肯定的

socketClient.java

package test.simple;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.net.Socket;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import test.socket.Message;


/***********************************************************************   
 *   
 *   socketClient.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 22, 2009   6:32:03 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class socketClient {
	private static final Log log = LogFactory.getLog(socketClient.class);
	private static int i = 0;
	private Socket s;
	private DataOutputStream out;
	private DataInputStream in;
	public socketClient() throws IOException {
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		socketClient c = new socketClient();
		c.talk();
	}

	/**
	 *   发送消息
	 * @param out
	 */
	public void sendMessage(Socket s) {
		try {
			 out = new DataOutputStream(s.getOutputStream());
			i++;
			out.writeBytes("wwww\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public void receiveMessage(Socket s) {
		try {
			 in = new DataInputStream(s.getInputStream());
					log.info("message::::" +in.readLine());;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void talk() throws Exception {
		while (true) {
			try {
				s = new Socket("localhost", 9988);
				sendMessage(s);
				receiveMessage(s);
				out.close();
				in.close();
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch(Exception e){
				e.printStackTrace();
			}
			finally {
		         try{
		           if(s!=null)s.close();  //断开连接
		         }catch (IOException e) {e.printStackTrace();}
		      }
		}
	}
}

    在这里我只写了一个SOCKET短连接,即收发消息后SOCKET断开一次,线程过5秒又建立连接收发消息

    注意点:

   public void sendMessage(Socket s) {
        try {
             out = new DataOutputStream(s.getOutputStream());
            i++;
            out.writeBytes("wwww\n");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    该方法 out.writeBytes("wwww\n"); 一定要写上\n结束符号才算一条消息结束,因为HelloWorldClient.java

   中的过滤 new TextLineCodecFactory() 需要/r/n一行一行读取。

   启动HelloWorldServer.java和socketClient.java 这样就可以实现 JAVA socket 和MINA 服务端通信了

  3、mina 传递对象

     其中原理和传递字符串是一样的,这里就不多说了

    client.java(客户端连接和过滤,客户端启动类)

 

package test.object;

import java.net.InetSocketAddress;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;

/***********************************************************************   
 *   
 *   client.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 22, 2009   6:16:29 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class client {
	private static final Log log = LogFactory.getLog(client.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Create TCP/IP connector.
		NioSocketConnector connector = new NioSocketConnector();
		// 创建接收数据的过滤器
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
		//设定这个过滤器将一行一行(/r/n)的读取数据
		chain.addLast("myChin", new ProtocolCodecFilter(new
				ObjectSerializationCodecFactory()));
		//设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
		connector.setHandler(new ObjectClientHandler());
		// Set connect timeout.
		connector.setConnectTimeoutCheckInterval(30);
		 //连结到服务器:  
        try  
        {  
            ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988)); 
            cf.awaitUninterruptibly();  
            cf.getSession().getCloseFuture().awaitUninterruptibly(); 
            Message b= new Message();
    		b.setStatus(1);
    		b.setType(2);
    		b.setMsgBody("test clinet");
            connector.broadcast(b);
        }  
        catch(Exception e)  
        {  
            connector.dispose();  
            log.error("未能连接到服务器");  
        }  
	}

}

    ObjectClientHandler.java(客户端业务逻辑处理类)

 

package test.object;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;


/***********************************************************************   
 *   
 *   ObjectClientHandler.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   3:47:40 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class ObjectClientHandler extends IoHandlerAdapter {
	// 当一个客端端连结进入时
	private static final Log log = LogFactory
			.getLog(ObjectClientHandler.class);

	public void sessionOpened(IoSession session) throws Exception {
		log.info("server  : " + session.getRemoteAddress());
	}

	// 当一个客户端关闭时
	public void sessionClosed(IoSession session) {
		log.info("one server  Disconnect !");
	}

	// 当客户端发送的消息到达时:
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		Message s = (Message) message;
		// Write the received data back to remote peer
		log.info("收到服务端发来的消息: " + s.getMsgBody()+"::"+s.getStatus()+"::"+s.getType());
//		Message b= new Message();
//		b.setStatus(1);
//		b.setType(2);
//		b.setMsgBody("test client");
//		session.write(b);
	}

	// 发送消息给客户机器
	public void messageSent(IoSession session,Object message) throws Exception {
		Message s = (Message) message;
		log.info("发送消息给服务端: " + s.getMsgBody()+"::"+s.getStatus()+"::"+s.getType());
	}

	// 发送消息异常
	public void exceptionCaught(IoSession session, Throwable cause) {
		session.close();
	}

	// //sessiong空闲
	// public void sessionIdle( IoSession session, IdleStatus status )
	// {
	// }
	// 创建 session
	public void sessionCreated(IoSession session) {

	}
}

    Server.java(服务端连接和过滤类,服务端启动类)

 

package test.object;

import java.net.InetSocketAddress;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import test.simple.HelloWorldServer;
import test.simple.HelloWorldServerHandler;

/***********************************************************************   
 *   
 *   Server.java     
 *   @copyright       Copyright:   2009-2012     
 *   @creator         周辉<br/>   
 *   @create-time   Aug 21, 2009   3:52:21 PM   
 *   @revision         $Id:     *   
 ***********************************************************************/
public class Server {
	private static final Log log = LogFactory.getLog(Server.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 创建一个非阻塞的Server端Socket,用NIO
			NioSocketAcceptor acceptor = new NioSocketAcceptor();

			// 创建接收数据的过滤器
			DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

			// 设定这个过滤器将一行一行(/r/n)的读取数据
			chain.addLast("codec", new ProtocolCodecFilter(
					new ObjectSerializationCodecFactory()));

			// 设定服务器端的消息处理器:一个ObjectServerHandler对象,
			acceptor.setHandler(new ObjectServerHandler());

			// 服务器端绑定的端口
			int bindPort = 9988;

			// 绑定端口,启动服务器
			acceptor.bind(new InetSocketAddress(bindPort));
			log.info("Mina Server is Listing on:= " + bindPort);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

    ObjectServerHandler.java(服务端业务处理类)

 

package test.object;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/*******************************************************************************
 * 
 * ObjectServerHandler.java
 * 
 * @copyright Copyright: 2009-2012
 * @creator 周辉<br/>
 * @create-time Aug 21, 2009 3:46:52 PM
 * @revision $Id: *
 ******************************************************************************/
public class ObjectServerHandler extends IoHandlerAdapter {
	// 当一个客端端连结进入时
	private static final Log log = LogFactory.getLog(ObjectServerHandler.class);

	public void sessionOpened(IoSession session) throws Exception {
		log.info("incomming client : " + session.getRemoteAddress());
	}

	// 当一个客户端关闭时
	public void sessionClosed(IoSession session) {
		log.info("one Clinet Disconnect !");
	}

	// 当客户端发送的消息到达时:
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		Message s = (Message) message;
		// Write the received data back to remote peer
		log.info("收到客户机发来的消息: " + s.getMsgBody() + "::" + s.getStatus() + "::"
				+ s.getType());
		Message b = new Message();
		b.setStatus(1);
		b.setType(2);
		b.setMsgBody("test zhou");
		session.write(b);
	}

	// 发送消息给客户机器
	public void messageSent(IoSession session, Object message) throws Exception {
		Message s = (Message) message;
		log.info("发送消息给客户端: " + s.getMsgBody() + "::" + s.getStatus() + "::"
				+ s.getType());
	}

	// 发送消息异常
	public void exceptionCaught(IoSession session, Throwable cause) {
		session.close();
	}

	// //sessiong空闲
	// public void sessionIdle( IoSession session, IdleStatus status )
	// {
	// }
	// 创建 session
	public void sessionCreated(IoSession session) {

	}
}

    message.java 和1.中的一样,这里不贴出来了

    启动Server.java 和client可以看运行效果了

    java socket客户端传递对象给 MINA 服务端,在MINA 收消息 的时候没有消息打出就关闭连接了,还没有试验出来。

    希望知道的朋友告诉一声。

分享到:
评论
3 楼 androidbest 2013-02-27  
求解啊,我也遇到问题了
2 楼 yanghaofeilong 2012-12-06  
支持一下。写得不错。
1 楼 sonyfe25cp 2009-11-03  


获益匪浅!!
初学Mina,经你的文章明白了很多。

Thanks a lot !!!!

相关推荐

    Mina+Socket通信

    通过阅读和理解这些代码,你可以更好地掌握Mina与Socket通信的实现方法,并应用于自己的项目中。 总的来说,Mina与Socket结合使用,可以构建出高效、灵活的网络通信解决方案。Mina的高级抽象简化了网络编程的复杂性...

    socket 与 mina 交互数据

    Socket和Mina是Java网络编程中的两个重要工具,它们在构建高性能、高并发的网络应用中发挥着关键作用。Socket是TCP/IP通信的基础,而Mina是一个高效的网络应用框架,它简化了网络编程的复杂性。 Socket,也被称为套...

    Android-MinaSocket一款基于Mina的Socket长连接库

    Apache Mina(Model-View-Controller for Network Applications)是一个高度可扩展和灵活的网络应用程序框架,它简化了TCP/IP和UDP/IP协议的实现,支持多种协议如HTTP、FTP、Telnet等。Mina的核心设计思想是将网络...

    MinaDemo.zip SpringBoot集成Socket通讯

    现在我们来详细探讨如何在SpringBoot项目中集成Mina进行Socket通讯,并结合myBatis进行数据交互。 首先,我们需要在SpringBoot项目中引入Mina的相关依赖。在`pom.xml`文件中添加Mina的依赖项,例如: ```xml ...

    mina2 实例程序(socket通讯调用远程方法)

    Apache Mina2是一个基于事件驱动和异步模型的网络应用框架,它为各种协议如TCP/IP、UDP/IP和HTTP等提供了一种统一的抽象层。Mina2通过高度封装的API,简化了网络编程的复杂性,使得开发者可以专注于业务逻辑,而无需...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    最后,“MinaDemo”可能是Mina框架的一个示例项目,你可以通过运行和分析这个项目,进一步掌握Mina的实战应用。 总结来说,本教程将引导你从理论到实践,掌握Java NIO的基本原理,理解Mina框架的使用,以及如何在...

    基于Android开发MINA框架使用详解

    - MINA提供了Socket和Datagram接口,分别对应TCP和UDP通信,支持自定义过滤器链,方便对数据进行处理和解析。 2. **MINA与Android集成** - 在Android项目中引入MINA依赖:你需要在build.gradle文件中添加MINA的...

    mina TCP、UDP通讯

    mina利用Java的Socket API,提供了一种简单的方式来创建TCP服务器和客户端。在mina中,我们可以创建一个Acceptor来监听特定的端口,当有客户端连接时,它会创建一个Session来处理这个连接。mina的EventDrivenSession...

    MINA通讯框架的两个简单实例和文档

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    mina服务器--实现纯文本和非纯文本的加密通讯

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,专门用于构建高性能、高可用性的网络应用程序,如TCP/IP和UDP服务。在这个主题中,“mina服务器--实现纯文本和非纯文本的加密...

    MINA NIO 高性能异步并发网络通讯框架

    利用 Mina 可以高效地完成以下任务: &lt;br&gt;TCP/IP 和 UDP/IP 通讯 串口通讯 VM 间的管道通讯 SSL/TLS JXM 集成 IoC 容器集成( Spring 、 Pico 等) 状态机 &lt;br&gt;据官方评测, APR 的...

    socket for android

    总的来说,掌握Android上的Socket编程对于开发需要实时数据交换的应用(如即时通讯、在线游戏等)至关重要。理解Socket的工作原理,以及如何在Android环境中使用它,是提升Android应用开发技能的重要一步。同时,...

    Mina通讯,长连接,Jar包,以及中文文档

    它为开发者提供了构建网络应用的简单、灵活和高效的工具,广泛应用于TCP/IP协议栈如TCP、UDP等以及Socket通讯,同时也支持FTP、SMTP、HTTP等多种协议。 在Android开发中,Mina库常用于实现服务器端的长连接通信。长...

    springboot 整合mina 源码,nio通讯基础教程,mina框架基础教程.rar

    在实际的通信过程中,客户端需要创建一个Socket连接到服务器的8080端口,然后通过SocketChannel发送和接收数据。服务器端接收到连接请求后,会创建一个IoSession,每个IoSession代表一个客户端连接。通过IoSession,...

    基于mina的及时通信

    通过阅读和分析`cim_for_mina`项目的源代码,你可以了解Mina如何应用于即时通讯,同时也能提升自己的网络编程能力。在实践中不断调试和优化,你会对Mina有更深入的理解,也可以为自己的项目开发积累宝贵经验。

    队列,mina通信的结合实例

    在IT行业中,队列(Queue)和MINA通信框架是两个关键的概念,它们在系统设计和网络编程中扮演着重要角色。本实例将探讨如何将队列与MINA通信框架结合,以实现高效、可靠的网络服务。以下是关于这两个概念及其结合...

    mina2框架+项目实例教程

    一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。 Apache Mina也称为:  NIO...

    mina实例、资源包、学习文档

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    基于Java的高性能Java网络框架 MINA.zip

    MINA是用Java编写的,适用于TCP/IP和UDP/IP协议,包括Socket和Datagram通信。这个框架广泛应用于服务器端的开发,如HTTP服务器、FTP服务器、聊天服务器等。 MINA的核心特性: 1. **异步事件驱动**:MINA采用非阻塞...

Global site tag (gtag.js) - Google Analytics