Android从0开始写直播 基础篇 第4章

今天开始写服务器了

      由于我根本不会写服务器  前两天搞什么tomcat累了半死 没搞出来。 最终决定使用mina框架  实在是太简单这个框架  


直接上图  mina逻辑尽在此图

简单介绍下  mina就是socket连接的拓展版 :(懂socket自动跳过此段)

        socket是什么?   解释起来比较麻烦  简单说一下socket就是tcp ,udp上一层    所有的网络连接都是一个socket连接   在此链接里传输byte数据    那怎么让人懂你数据是个什么鬼    于是就有了协议  比如http协议。   这个协议把你接收到的数据解析成你看的懂得东西。所以你完全可以自定义协议   就有了我们现在需要rtp协议了   具体自己去查资料


继续mina

    首先我们用eclipse  创建一个“java工程”  打开eclipse左上角 file ->  new  -> other  ->  java Project

就创建了一个java  工程   接下来找到src  右键创建个包  再创建一个class 

   然后你要导入4个库 


右键项目名Build  Path-> configure  Build Path 


Add  External JARs..     添加你下载的库

然后我们上代码 (我不知道哪里)

public class MinaTimeServer {
	 // 服务器监听端口    
    private static final int PORT = 8033;    
  
    public MinaTimeServer() {    
        // TODO Auto-generated constructor stub    
    }    
   
    public static void main(String[] args) {    
    	// 服务器端的主要对象    
        IoAcceptor acceptor = new NioSocketAcceptor();    
          
        // 设置Filter链     
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());    
        // 协议解析,采用mina现成的UTF-8字符串处理方式    
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));    
  
        // 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler)    
        acceptor.setHandler(new TimeServerHandler() );    
        // 设置接收缓存区大小    
        acceptor.getSessionConfig().setReadBufferSize(2048);    
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  //读写通道无任何操作就进入空闲状态  
        try {    
            // 服务器开始监听    
            acceptor.bind( new InetSocketAddress(PORT) );    
        }catch(Exception e){    
            e.printStackTrace();    
        }    
    }    
}
public class TimeServerHandler extends IoHandlerAdapter {

	@Override
	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		cause.printStackTrace();
	}

	/*
	 * 这个方法是目前这个类里最主要的, 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 如果是quit,则关闭客户端连接
	 */
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		String str = message.toString();
		if (str.trim().equalsIgnoreCase("quit")) {
			session.close();
			return;
		}
		Date date = new Date();
		System.out.println("hello" + str + session.getRemoteAddress() + date.toString());

		session.write("iamrecived");

		System.out.println("Message written...");

	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		super.sessionClosed(session);
		System.out.println("客户端与服务端断开连接.....");
	}

}

ok了 直接点击run  就可以了  服务器自动跑起来  在监听别人访问他   (你有可能遇到端口被占用问题  换一下端口号就好了)


服务器搞定接下来试试  客户端

同上面的流程  建一个java Project  在导入相同jar  然后直接上代码  

public class MinaClient {       
      
    public static void main(String []args)throws Exception{       
               
        //Create TCP/IP connection       
        NioSocketConnector connector = new NioSocketConnector();       
               
        //创建接受数据的过滤器       
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();       
               
        //设定这个过滤器将一行一行(/r/n)的读取数据       
        chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));       
               
        //客户端的消息处理器:一个SamplMinaServerHander对象       
        connector.setHandler(new MinaClientHandler());       
               
        //set connect timeout       
        connector.setConnectTimeout(5000);       
               
        //连接到服务器:       
        ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",8033));       
               
//        Wait for the connection attempt to be finished.       
        cf.awaitUninterruptibly();       
               
        cf.getSession().getCloseFuture().awaitUninterruptibly();       
               
        connector.dispose();       
    }      
}    
public class MinaClientHandler extends IoHandlerAdapter {    
    // 当客户端连接进入时    
    @Override    
    public void sessionOpened(IoSession session) throws Exception {    
        System.out.println("incomming 客户端: " + session.getRemoteAddress());    
        session.write("i am coming");    
    }    
    
    @Override    
    public void exceptionCaught(IoSession session, Throwable cause)    
            throws Exception {    
        System.out.println("客户端发送信息异常....");    
    }    
    
    // 当客户端发送消息到达时    
    @Override    
    public void messageReceived(IoSession session, Object message)    
            throws Exception {    
    
        System.out.println("服务器返回的数据:" + message.toString());    
    }    
    
    @Override    
    public void sessionClosed(IoSession session) throws Exception {    
        System.out.println("客户端与服务端断开连接.....");    
    }    
    
    @Override    
    public void sessionCreated(IoSession session) throws Exception {    
        // TODO Auto-generated method stub    
        System.out    
                .println("one Client Connection" + session.getRemoteAddress());    
        session.write("我来了······");    
    }    
    
}    

ok了  

先运行服务器   在运行客户端   就可以看到控制台的log了  随便研究下就知道大致什么鬼了  

ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",8033)); 
这个localhost  就是本机  你可以替换成ip地址  

看一下最开始的图  就是创建一个实例   设置一串filter (筛选协议的 )  然后处理后的值传给handler   

大致就是这个意思  

服务器建立好了   

下一章我们讲rtp  协议传输解析

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值