strburnchang 2016-01-05
客户端socket传对象给mina服务端暂时不通,可能跟下面传中文字符串有些类似.
应该和mina端过滤器的相关设置有关.
服务端:
1 MinaServer.java
package com.nafio.server; import java.io.IOException; import java.net.InetSocketAddress; 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; public class MinaServer { private static MinaServer minaServer = null; //创建一个非阻塞的Server端Socket private SocketAcceptor acceptor = new NioSocketAcceptor(); //创建接收数据的过滤器 private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); private int bindPort = 8888; //单例 public static MinaServer getInstances() { if (null == minaServer) { minaServer = new MinaServer(); } return minaServer; } private MinaServer() { //设定这个过滤器将按对象读取数据 //单例模式---------------------------------------- // chain.addLast("myChin", new ProtocolCodecFilter( // new ObjectSerializationCodecFactory())); //设定服务器端的消息处理器:一个MinaServerHandler对象, // acceptor.setHandler(ServerHandler.getInstances()); //非单例模式--------------------------------------- //接收文字 chain.addLast("myChin", new ProtocolCodecFilter( new TextLineCodecFactory())); //接收对象 // chain.addLast("myChin", new ProtocolCodecFilter( // new ObjectSerializationCodecFactory())); acceptor.setHandler(new ServerHandler()); try { //绑定端口,启动服务器 acceptor.bind(new InetSocketAddress(bindPort)); } catch (IOException e) { e.printStackTrace(); } System.out.println("服务端:监听端口--->" + bindPort); } public static void main(String[] args) throws Exception { MinaServer.getInstances(); //new MinaServer(); } }
2 ServerHandler.java
package com.nafio.server; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import com.nafio.obj.TransferObj; //下面两种写法应该等同,不确定? //public class ServerHandler extends IoHandlerAdapter { public class ServerHandler extends IoFilterAdapter implements IoHandler { private static ServerHandler samplMinaServerHandler = null; public static ServerHandler getInstances() { if (null == samplMinaServerHandler) { samplMinaServerHandler = new ServerHandler(); } return samplMinaServerHandler; } public ServerHandler() { } public void sessionOpened(IoSession session) throws Exception { System.out.println("服务端:会话打开"); } public void sessionClosed(IoSession session) { } public void messageReceived(IoSession session, Object message)throws Exception { //接收字符串 String str = (String)message; System.out.println("服务端:收到客户端发来的信息--->"+str); //System.out.println("服务端:收到信息"); //接收对象 // if (message instanceof TransferObj) { // TransferObj obj = (TransferObj) message; // System.out.println("服务端:收到客户端数据--->"+obj.getDate());+ // } } public void exceptionCaught(IoSession arg0, Throwable arg1)throws Exception { } public void messageSent(IoSession arg0, Object arg1) throws Exception { } public void sessionCreated(IoSession arg0) throws Exception { System.out.println("服务端:会话创建"); } public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { } }
socket客户端
SocketClient.java
package com.nafio.socketclient; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.Socket; import com.nafio.obj.TransferObj; public class SocketClient { private Socket s; private DataOutputStream out; private DataInputStream in; public SocketClient() throws IOException { } public static void main(String[] args) throws Exception { SocketClient c = new SocketClient(); c.talk(); } // 发送对象 // ObjectOutputStream oos; // TransferObj obj; public void sendMessage(Socket s) { try { //socket传字符串 out = new DataOutputStream(s.getOutputStream()); byte[] bt="中文\n".getBytes(); out.write(bt); out.writeBytes("nafio_date\n"); //out.writeUTF("中文\n");//by nafio这么写不行 //socket传对象 // oos = new ObjectOutputStream(s.getOutputStream()); // obj=new TransferObj(); // obj.setDate("socketDateToMina"); // oos.writeObject(obj); // oos.flush(); } catch (IOException e) { e.printStackTrace(); } } public void receiveMessage(Socket s) { try { in = new DataInputStream(s.getInputStream()); } catch (Exception e) { e.printStackTrace(); } } public void talk() throws Exception { /*while (true)*/ { try { //发送对象 //oos.close(); s = new Socket("localhost", 8888); System.out.println("客户端:发送信息"); sendMessage(s); System.out.println("发送信息完毕!"); //发字符串 //receiveMessage(s); out.close(); //in.close(); } catch(Exception e){ e.printStackTrace(); } finally { try{ if(s!=null)s.close(); //断开连接 }catch (IOException e) {e.printStackTrace();} } } } }