xref: /xiu/protocol/rtmp/src/rtmp.rs (revision 69de9bbd)
18e71d710SHarlan use streamhub::define::StreamHubEventSender;
20d3b29c8SHarlanC 
30d3b29c8SHarlanC use super::session::server_session;
453a2e033SHarlanC use std::net::SocketAddr;
50d3b29c8SHarlanC use tokio::io::Error;
60d3b29c8SHarlanC use tokio::net::TcpListener;
70d3b29c8SHarlanC 
80d3b29c8SHarlanC pub struct RtmpServer {
90d3b29c8SHarlanC     address: String,
108e71d710SHarlan     event_producer: StreamHubEventSender,
118e71d710SHarlan     gop_num: usize,
120d3b29c8SHarlanC }
130d3b29c8SHarlanC 
140d3b29c8SHarlanC impl RtmpServer {
new(address: String, event_producer: StreamHubEventSender, gop_num: usize) -> Self158e71d710SHarlan     pub fn new(address: String, event_producer: StreamHubEventSender, gop_num: usize) -> Self {
160d3b29c8SHarlanC         Self {
170d3b29c8SHarlanC             address,
180d3b29c8SHarlanC             event_producer,
198e71d710SHarlan             gop_num,
200d3b29c8SHarlanC         }
210d3b29c8SHarlanC     }
220d3b29c8SHarlanC 
run(&mut self) -> Result<(), Error>230d3b29c8SHarlanC     pub async fn run(&mut self) -> Result<(), Error> {
240d3b29c8SHarlanC         let socket_addr: &SocketAddr = &self.address.parse().unwrap();
250d3b29c8SHarlanC         let listener = TcpListener::bind(socket_addr).await?;
260d3b29c8SHarlanC 
2788325f54SHarlanC         log::info!("Rtmp server listening on tcp://{}", socket_addr);
280d3b29c8SHarlanC         loop {
290d3b29c8SHarlanC             let (tcp_stream, _) = listener.accept().await?;
300d3b29c8SHarlanC             //tcp_stream.set_keepalive(Some(Duration::from_secs(30)))?;
310d3b29c8SHarlanC 
328e71d710SHarlan             let mut session = server_session::ServerSession::new(
338e71d710SHarlan                 tcp_stream,
348e71d710SHarlan                 self.event_producer.clone(),
358e71d710SHarlan                 self.gop_num,
368e71d710SHarlan             );
370d3b29c8SHarlanC             tokio::spawn(async move {
380d3b29c8SHarlanC                 if let Err(err) = session.run().await {
39*69de9bbdSHarlanC                     log::info!(
408baa1d3cSHarlan                         "session run error: session_type: {}, app_name: {}, stream_name: {}, err: {}",
41740804e8SHarlanC                         session.common.session_type,
42740804e8SHarlanC                         session.app_name,
438baa1d3cSHarlan                         session.stream_name,
448baa1d3cSHarlan                         err
4553a2e033SHarlanC                     );
460d3b29c8SHarlanC                 }
470d3b29c8SHarlanC             });
480d3b29c8SHarlanC         }
490d3b29c8SHarlanC     }
500d3b29c8SHarlanC }
51