欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 20:33:18
...

今天开始写服务器了

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

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

直接上图  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个库 

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

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

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

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  协议传输解析