• nio/mina(四)客户端socket与mina服务端通信


    客户端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();}
    			}
    		}
    	}
    }


     


     

  • 相关阅读:
    利用gcc的__attribute__编译属性section子项构建初始化函数表
    Linux调试
    使用C++ stringstream来进行数据类型转换
    UseConcMarkSweepGC
    Django 3.1 发布,异步支持增强
    网易云音乐的消息队列改造之路
    二维码预生成:码上营销的并发之痛
    源码 redis 分布式锁
    跨度实际上是用来计算排位(rank) 目标节点在跳跃表中的排位 有序集 排序计算
    为什么有序集合需要同时使用跳跃表和字典来实现?
  • 原文地址:https://www.cnblogs.com/nafio/p/9137761.html
Copyright © 2020-2023  润新知