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 env_logger::init(); 16 Self { 17 address, 18 event_producer, 19 } 20 } 21 22 pub async fn run(&mut self) -> Result<(), Error> { 23 let socket_addr: &SocketAddr = &self.address.parse().unwrap(); 24 let listener = TcpListener::bind(socket_addr).await?; 25 26 let mut idx = 0; 27 28 loop { 29 let (tcp_stream, _) = listener.accept().await?; 30 //tcp_stream.set_keepalive(Some(Duration::from_secs(30)))?; 31 32 let mut session = 33 server_session::ServerSession::new(tcp_stream, self.event_producer.clone(), idx); 34 tokio::spawn(async move { 35 if let Err(err) = session.run().await { 36 print!( 37 "session type: {}, id {}, session error {}\n", 38 session.session_type, session.session_id, err 39 ); 40 log::error!( 41 "session type: {}, id {}, session error {}\n", 42 session.session_type, 43 session.session_id, 44 err 45 ); 46 } 47 }); 48 49 idx = idx + 1; 50 } 51 } 52 } 53