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 {@Overridepublic void exceptionCaught(IoSession session, Throwable cause) throws Exception {cause.printStackTrace();}/** 这个方法是目前这个类里最主要的, 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端 如果是quit,则关闭客户端连接*/@Overridepublic 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...");}@Overridepublic void sessionClosed(IoSession session) throws Exception {// TODO Auto-generated method stubsuper.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 协议传输解析
Android从0开始写直播 基础篇 第4章相关推荐
- 【QT开发笔记-基础篇】| 第二章 常用控件 | 2.12 表格控件 QTableWidget
本节对应的视频讲解:B_站_链_接 QTableWidget 是 Qt 中的表格控件,可以行列的形式来展示数据 1. 属性和方法 QTableWidget 有很多属性和方法,完整的可查看帮助文档. 在 ...
- MySQL基础篇——第11章 DML(数据操作):增删改
MySQL基础篇--第11章 DML(数据操作):增删改 1. 插入数据(增) INSERT INTO ... 使用 INSERT INTO 语句向表中插入数据(记录) 1.1 方式1:VALUES ...
- python从零到一之基础篇 第 四 章 流程控制语句
python基础篇学习 第一章 第二章(上) 第二章(下) 第三章 今天开始学习第四章
- 深入探索 Android 网络优化(二、网络优化基础篇)上
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 思维大图大纲 一.为什么要进行网络优化? 等待网络是我们 App 最大的性能瓶颈,再怎么优化 ...
- 小老弟!听说你在搞Android 10.0 适配,看这篇就妥了!
点击上方"何俊林",马上关注,每天早上8:50准时推送 真爱,请置顶或星标 转载自公众号:刘望舒,作者: 吃猫猫的鱼 地址:https://juejin.im/post/5cad5 ...
- 深入探索 Android 网络优化(二、网络优化基础篇)下
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 思维大图大纲 八.移动网络 用 2G 看 txt,用 3G 看 jpg,用 4G 看 avi ...
- 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置
第六章.Linux的文件权限与目录配置 最近更新日期:2009/08/18 Linux最优秀的地方之一,就在于他的多人多任务环境.而为了让各个使用者具有较保密的文件数据,因此文件的权限管理就变的很重要 ...
- 鸟哥的Linux私房菜(基础篇)- 第二十一章、系统配置工具(网络与打印机)与硬件侦测
第二十一章.系统配置工具(网络与打印机)与硬件侦测 最近升级日期:2009/09/15 除了手动配置之外,其实系统提供了一个名为 setup 的命令给系统管理员使用喔!这个命令还能够配置网络呢.此外, ...
- 大数据基础篇~JavaSE第一章
大数据基础篇教程分享01 目前计算机专业现状,java开发工程师虽然容易找工作(这个也是在你在大学期间java基础学习的比较好,然后会一些框架,才能找到工作)但是java开发常常熬夜,楼主就是卷不动j ...
最新文章
- Linux监控工具dstat
- python算法书籍-你也能看得懂的Python算法书
- boost::callable_traits的has_varargs的测试程序
- android加载so文件失败,Android无法加载'.so.1'文件
- r语言教程w3c,R语言 数据库
- 了解JUnit的Runner架构
- Java正则之Unicode属性匹配的那些事
- java传感器编程_JSensorReader 无线传感器网络环境,直接从节点读取 采集数据的java程序 Script 249万源代码下载- www.pudn.com...
- python银行排队系统_python-我需要基于Web的系统的消息/排队解决...
- Spring Boot从Controller层进行单元测试
- jquery mobile页面跳转后js不执行的问题
- hdu2089不要62(数位dp)
- 7 年零故障支撑双 11,消息中间件 RocketMQ 如何做到?
- 举个栗子~Tableau 技巧(205 ):区域地图中呈现具体位置
- ajax传参遇到问题
- AI论文投稿前的自我反思
- java升序排列数组_java 数组升序排列
- 怎么把音乐中的伴奏提取出来?这几个方法值得尝试一番
- blank=True, null=True的区别
- springboot+oss文件批量打包下载
热门文章
- Yii的createCommand用法
- 无法访问javax.servlet.ServletException
- win10生成UWP软件打包 安装UWP软件
- JavaScript单线程异步的背后——事件循环机制
- python3 excel样式_xls0-python3my使用python.pandas修改excel样式
- phpStudy闪退
- html超链接qq临时会话,【一个小功能】点击图标/链接发起QQ临时会话
- cad二次开发 java_关于CAD二次开发,你究竟知道多少?
- 科技日新月异带来的影响
- 10款UML建模工具最近更新(2021年2月)(二)-EDraw、StarUML、SinelaboreRT