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 协议传输解析
上一篇: 金子原来是这么生产出来的,感叹~