//constructor to set all of these variables from an RTP model pass public ClientModel(int rand, Video vid, RTPmodel rtp) { id = rand; seq = 1; _video = vid; _RTPmodel = rtp; _timer = new RTSPtimer(rand); _timer.Interval = interval; }
private void Time_Process(Object obj, ElapsedEventArgs args) { RTSPtimer t = (RTSPtimer)obj; for (int i = 0; i < _ClientModels.Count; i++) { if (_ClientModels.ElementAt(i).Get_ID() == t.Get_ID()) { _ClientModels.ElementAt(i).Inc_Seq(); RTPmodel rtp = _ClientModels.ElementAt(i).Get_RTP(); IPEndPoint ep = rtp.Get_EndPoint(); Video vid = _ClientModels.ElementAt(i).Get_Video(); byte[] rcv = vid.Get_NextFrame(); RTPpacket rtp_pack = new RTPpacket(rcv, _ClientModels.ElementAt(i).Get_Seq(), rcv.Length); if (_view.Get_Check()) { Add_Server(rtp_pack.Get_Header() + "\r\n"); } rtp.Send_Data(rtp_pack.Get_Bytes()); } } }
public void Main_Handler(object o) { //networking variables Socket s = (Socket)o; byte[] rcv = new byte[264]; //control variables int cnt = 0; //extension of the class count variable int rnd = 0; //extension of the class rand variable int seq = 1; //for the sequence number bool set = true; //setup is always initially true //class variables RTPmodel _RTPmodel = null; ClientModel _newClient = null; Video _video = null; //try and catch all potential socket reactions try { while (set) { bool exit = false; int size = s.Receive(rcv); if (size == 0) { break; } string size_mess = System.Text.Encoding.UTF8.GetString(rcv, 0, size); _view.Add_Client_del(size_mess); string check_set = System.Text.Encoding.UTF8.GetString(rcv, 0, 4); if (check_set == "SETU" && set) { //rtp string[] new_str = size_mess.Split(new char[] { '=' }); int p = int.Parse(new_str[1]); _RTPmodel = new RTPmodel(p); //video string vid = System.Text.Encoding.UTF8.GetString(rcv, 28, 12); _video = new Video(vid); rnd = Get_Random(); //client _newClient = new ClientModel(rnd, _video, p); _ClientModels.Add(_newClient); cnt = count++; //update serv Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is setting up\r\n"); _ClientModels.ElementAt(cnt).Get_Timer().Elapsed += Time_Process; set = false; //response string reqt = "RTSP/1.0 200 OK\r\n"; string cseq = "CSeq: " + seq + "\r\n"; ++seq; string sess = "Session: " + _ClientModels.ElementAt(cnt).Get_ID() + "\r\n"; string mess = reqt + cseq + sess + "\r\n"; byte[] mb = System.Text.Encoding.ASCII.GetBytes(mess); s.Send(mb); } //otherwise the setup is not required while (!set) { int size_ns = s.Receive(rcv); if (size == 0) { break; } string size_mess_ns = System.Text.Encoding.UTF8.GetString(rcv, 0, size); _view.Add_Client_del(size_mess_ns); string check_set_ns = System.Text.Encoding.UTF8.GetString(rcv, 0, 4); //determine which action is being performed... if (check_set_ns == "PLAY") { string reqt_play = "RTSP/1.0 200 OK\r\n"; string cseq_play = "CSeq: " + seq + "\r\n"; ++seq; string sess_play = "Session: " + _ClientModels.ElementAt(cnt).Get_ID() + "\r\n"; string mess_play = reqt_play + cseq_play + sess_play + "\r\n"; byte[] mb_play = System.Text.Encoding.ASCII.GetBytes(mess_play); s.Send(mb_play); Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is playing " + _video.Get_Name() + "\r\n"); _ClientModels.ElementAt(cnt).startTimer(); } else if (check_set_ns == "PAUS") { string reqt_paus = "RTSP/1.0 200 OK\r\n"; string cseq_paus = "CSeq: " + seq + "\r\n"; ++seq; string sess_paus = "Session: " + rnd + "\r\n"; string mess_paus = reqt_paus + cseq_paus + sess_paus + "\r\n"; byte[] mb_paus = System.Text.Encoding.ASCII.GetBytes(mess_paus); s.Send(mb_paus); Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " paused " + _video.Get_Name() + "\r\n"); _ClientModels.ElementAt(cnt).stopTimer(); } else if (check_set_ns == "TEAR") { string reqt_stop = "RTSP/1.0 200 OK\r\n"; string cseq_stop = "CSeq: " + seq + "\r\n"; ++seq; string sess_stop = "Session: " + rnd + "\r\n"; string mess_stop = reqt_stop + cseq_stop + sess_stop + "\r\n"; byte[] mb_stop = System.Text.Encoding.ASCII.GetBytes(mess_stop); s.Send(mb_stop); Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is tearing down " + _video.Get_Name() + "\r\n"); _ClientModels.ElementAt(cnt).stopTimer(); _ClientModels.ElementAt(cnt).Get_Video().Trash_Video(); this.used.Remove(_ClientModels.ElementAt(cnt).Get_ID()); set = true; } else { //dead state... } } if (exit) { break; } } } catch (SocketException e) { if (s != null) { s.Close(); } } finally { _ClientModels.ElementAt(cnt).stopTimer(); s.Close(); } }