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