/*
* @(#)Connection.java 1.9 99/06/21
*
* Copyright 1996-1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package com.sun.media.rtsp;
import java.io.*;
import java.net.*;
public class Connection extends Thread implements Runnable {
public int connectionId;
private Socket socket;
private RtspManager rtspManager;
private MessageProcessor mp;
private boolean connectionIsAlive;
public Connection(RtspManager rtspManager, int connectionId,
byte dstAddress[], int port) throws UnknownHostException,
ConnectException {
this.rtspManager = rtspManager;
this.connectionId = connectionId;
String domain = new String(dstAddress);
InetAddress dst = InetAddress.getByName(domain);
try {
// System.err.println( "dst: " + dst);
socket = new Socket(dst, port);
// System.err.println( "TI Socket: " + socket.toString());
start();
} catch (IOException e) {
throw new ConnectException();
}
}
public Connection(RtspManager rtspManager, int connectionId, Socket socket) {
this.rtspManager = rtspManager;
this.connectionId = connectionId;
this.socket = socket;
start();
}
public boolean sendData(byte message[]) {
boolean success = false;
try {
OutputStream out = socket.getOutputStream();
out.write(message);
out.flush();
success = true;
} catch (IOException e) {
// e.printStackTrace();
}
return success;
}
public void run() {
// System.out.println( "Connection-" + connectionId + " running...");
connectionIsAlive = true;
while (connectionIsAlive) {
try {
InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(in);
byte ch = din.readByte();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// read message header:
baos.write(ch);
while (!eomReached(baos.toByteArray())) {
baos.write(din.readByte());
}
// read message body:
int length = getContentLength(new String(baos.toByteArray()));
for (int i = 0; i < length; i++) {
baos.write(din.readByte());
}
if (mp == null) {
mp = new MessageProcessor(connectionId, rtspManager);
}
mp.processMessage(baos.toByteArray());
}
catch (Exception e) {
// System.out.println( "RTSP Connection terminated");
connectionIsAlive = false;
}
}
}
private boolean eomReached(byte buffer[]) {
boolean endReached = false;
int size = buffer.length;
if (size >= 4) {
if (buffer[size - 4] == '\r' && buffer[size - 3] == '\n' &&
buffer[size - 2] == '\r' && buffer[size - 1] == '\n') {
endReached = true;
}
}
return endReached;
}
private int getContentLength(String msg_header) {
int length;
int start = msg_header.indexOf("Content-length");
if (start == -1) {
// fix for QTSS:
start = msg_header.indexOf("Content-Length");
}
if (start == -1) {
length = 0;
} else {
start = msg_header.indexOf(':', start) + 2;
int end = msg_header.indexOf('\r', start);
String length_str = msg_header.substring(start, end);
length = new Integer(length_str).intValue();
}
return length;
}
public void cleanup() {
Debug.println("RTSP::Connection:cleanup, id=" + connectionId);
close();
rtspManager.removeConnection(connectionId);
}
public void close() {
connectionIsAlive = false;
try {
if (socket != null) {
// System.out.println( "close socket");
socket.close();
socket = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
public String getIpAddress() {
return socket.getInetAddress().getHostAddress();
}
}
|