xref: /xiu/protocol/rtmp/src/rtmp.rs (revision 88d91efd)
1 use super::channels::define::ChannelEventProducer;
2 
3 use super::session::server_session;
4 use std::net::SocketAddr;
5 use tokio::io::Error;
6 use tokio::net::TcpListener;
7 
8 pub struct RtmpServer {
9     address: String,
10     event_producer: ChannelEventProducer,
11 }
12 
13 impl RtmpServer {
14     pub fn new(address: String, event_producer: ChannelEventProducer) -> Self {
15         Self {
16             address,
17             event_producer,
18         }
19     }
20 
21     pub async fn run(&mut self) -> Result<(), Error> {
22         let socket_addr: &SocketAddr = &self.address.parse().unwrap();
23         let listener = TcpListener::bind(socket_addr).await?;
24 
25         log::info!("Rtmp server listening on tcp://{}", socket_addr);
26         loop {
27             let (tcp_stream, _) = listener.accept().await?;
28             //tcp_stream.set_keepalive(Some(Duration::from_secs(30)))?;
29 
30             let mut session =
31                 server_session::ServerSession::new(tcp_stream, self.event_producer.clone());
32             tokio::spawn(async move {
33                 if let Err(err) = session.run().await {
34                     log::info!(
35                         "session exits, session_type: {}, app_name: {}, stream_name: {}",
36                         session.common.session_type,
37                         session.app_name,
38                         session.stream_name
39                     );
40                     log::trace!("session err: {}", err);
41                 }
42             });
43         }
44     }
45 }
46