package com.guo.duoduo.airplayreceiver.rtsp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.regex.Pattern; import com.guo.duoduo.airplayreceiver.utils.Debug; /** * Created by Guo.Duo duo on 2015/9/9. */ public class RTSPResponder extends Thread { private static final String tag = RTSPResponder.class.getSimpleName(); private Socket socket; private int[] fmtp; private byte[] aesiv, aeskey; private BufferedReader in; private static final Pattern completedPacket = Pattern.compile("(.*)\r\n\r\n"); public RTSPResponder(Socket socket) throws IOException { this.socket = socket; in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } public RTSPResponse handlePacket(RTSPPacket packet) { RTSPResponse response = new RTSPResponse("RTSP/1.0 200 OK"); response.append("Audio-Jack-Status", "connected; type=analog"); response.append("CSeq", packet.valueOfHeader("CSeq")); String req = packet.getReq(); String content = packet.getContent(); Debug.d(tag, "raop rtsp request = " + req); Debug.d(tag, "raop rtsp content = " + content); if (req.contains("POST")) { } else if (req.contentEquals("ANNOUNCE")) { } else if (req.contentEquals("TEARDOWN")) { } return response; } @Override public void run() { try { do { Debug.d(tag, "raop listening packets"); StringBuffer packet = new StringBuffer(); int ret = 0; do { char[] buffer = new char[4096]; ret = in.read(buffer); packet.append(new String(buffer)); } while (ret != -1 && !completedPacket.matcher(packet.toString()).find()); if (ret != -1) { RTSPPacket request = new RTSPPacket(packet.toString()); Debug.d(tag, "raop rtsp request = " + request.toString()); RTSPResponse response = this.handlePacket(request); Debug.d(tag, "raop rtsp response = " + response.toString()); try { BufferedWriter oStream = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); oStream.write(response.getRawPacket()); oStream.flush(); } catch (IOException e) { e.printStackTrace(); } if ("TEARDOWN".equals(request.getReq())) { socket.close(); socket = null; } } else { socket.close(); socket = null; } } while (socket != null); } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }