package server;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;
import java.util.Random;
public class SIPJavaServer extends Thread {
protected Socket clientSocket = null;
private static String cliResponse = null;
private static String srcAddress = "sip:
[email protected]";
private static String destAddress = "sip:
[email protected]";
private static String versionNum = "SIP/2.0";
private static String message = null;
private static String message1 = null;
private static String message2 = "";
private static String cseqcode = null;
private static String callidSeq = null;
private static String strT = null;
private static final String invTran = "Call or Transaction does not exist";
private boolean dr = false;
static Header hed = new Header();
public SIPJavaServer(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void run() {
BufferedOutputStream dos = null;
while (true) {
try {
DataInputStream dis = new DataInputStream(clientSocket
.getInputStream());
while(true)
{
//read line by line from client
message = dis.readLine();
if(message !=null)
{
if(message.length() == 0 && message1 != null) {
if(message1.contains("OPTIONS") && dr == false)
{
int i = message1.indexOf("Content-Length:");
int j = "Content-Length:".length();
strT = message1.substring(i+j+1);
strT = strT.trim();
if(!strT.equals("0"))
{
dr = true;
message1 = message1 + '\n';
continue;
}
else
{
break;
}
}
else
{
break;
}
}
if (message1 == null) {
message1 = message + '\n';
} else if(dr == true && !(message.length() == Integer.parseInt(strT)))
{
message2 = message + '\n';
message1 = message1 + message + '\n';
}
else if(dr == true && (message.length() == Integer.parseInt(strT)))
{
message2 = message + '\n';
message1 = message1 + message + '\n';
dr = false;
break;
}
else
{
message1 = message1 + message + '\n';
}
}
}
message1 = message1 + '\n';
//message1 = message1.trim();
verifyMessage(message1);
message1 = null;
dos = new BufferedOutputStream(clientSocket
.getOutputStream());
if (cliResponse.equalsIgnoreCase("Invite"))
{
message = create200OK(cseqcode);
dos.write(message.getBytes());
dos.flush();
System.out.println("sent 200 OK");
}
else if (cliResponse.equalsIgnoreCase("ACK"))
{
System.out.println("call established");
}
else if (cliResponse.equalsIgnoreCase("OPTIONS"))
{
System.out.println("Message received: " + message2);
message = create200OK(cseqcode);
dos.write(message.getBytes());
dos.flush();
}
else if (cliResponse.equalsIgnoreCase("BYE"))
{
System.out.println("data transfer over");
System.out.println("send final 200 OK to client");
message = create200OK(cseqcode);
dos.write(message.getBytes());
dos.flush();
System.out.println("********End of Transaction*********");
break;
}
else if(cliResponse.equalsIgnoreCase("BadRequest"))
{
System.out.println("sending 400 bad request..");
message = createBadRequest();
dos.write(message.getBytes());
dos.flush();
System.out.println("Exiting...");
break;
}
else if(cliResponse.equalsIgnoreCase(invTran))
{
System.out.println("sending 481 invalid transaction..");
message = createInvTran();
dos.write(message.getBytes());
dos.flush();
System.out.println("Exiting...");
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static String verifyMessage(String message) {
if (message.startsWith("INVITE")) {
if (message.contains("Max-Forwards:") && message.contains("To:")
&& message.contains("From:")
&& message.contains("Call-ID:")
&& message.contains("CSeq:")
&& message.contains("Contact:")
&& message.contains("Content-Length:")) {
System.out.println("succesfull invite");
int x = message.indexOf("CSeq:");
int p = x + "CSeq:".length();
int q = message.indexOf("\n", p);
cseqcode = null;
cseqcode = message.substring(p, q);
callidSeq = null;
x = message.indexOf("Call-ID:");
p = x + "Call-ID:".length();
q = message.indexOf("\n", p);
callidSeq = message.substring(p, q);
hed.setCallId(callidSeq);
cliResponse = "Invite";
} else {
cliResponse = "BadRequest";
}
} else if (message.startsWith("ACK")) {
if (message.contains("To:")
&& message.contains("From:")
&& message.contains("Call-ID:")
&& message.contains("CSeq:"))
{
int x = message.indexOf("CSeq:");
int p = x + "CSeq:".length();
int q = message.indexOf("\n", p);
cseqcode = null;
cseqcode = message.substring(p, q);
callidSeq = null;
x = message.indexOf("Call-ID:");
p = x + "Call-ID:".length();
q = message.indexOf("\n", p);
callidSeq = message.substring(p, q);
if(hed.getCallId().equalsIgnoreCase(callidSeq))
{
System.out.println("succesfull Ack");
cliResponse = "ACK";
}
else
cliResponse = invTran;
}
else {
cliResponse = "BadRequest";
}
} else if (message.startsWith("OPTIONS")) {
if (message.contains("Max-Forwards:") && message.contains("To:")
&& message.contains("From:")
&& message.contains("Call-ID:")
&& message.contains("CSeq:")
&& message.contains("Contact:")
&& message.contains("Content-Length:"))
{
int x = message.indexOf("CSeq:");
int p = x + "CSeq:".length();
int q = message.indexOf("\n", p);
cseqcode = null;
cseqcode = message.substring(p, q);
callidSeq = null;
x = message.indexOf("Call-ID:");
p = x + "Call-ID:".length();
q = message.indexOf("\n", p);
callidSeq = message.substring(p, q);
if(hed.getCallId().equalsIgnoreCase(callidSeq))
{
System.out.println("succesfull options");
cliResponse = "OPTIONS";
}
else
cliResponse = invTran;
} else {
cliResponse = "BadRequest";
}
} else if (message.contains("BYE")) {
if (message.contains("Max-Forwards:") && message.contains("To:")
&& message.contains("From:")
&& message.contains("Call-ID:")
&& message.contains("CSeq:")
&& message.contains("Content-Length:"))
{
int x = message.indexOf("CSeq:");
int p = x + "CSeq:".length();
int q = message.indexOf("\n", p);
cseqcode = null;
cseqcode = message.substring(p, q);
callidSeq = null;
x = message.indexOf("Call-ID:");
p = x + "Call-ID:".length();
q = message.indexOf("\n", p);
callidSeq = message.substring(p, q);
if(hed.getCallId().equalsIgnoreCase(callidSeq))
{
System.out.println("succesfull bye");
cliResponse = "BYE";
}
else
cliResponse = invTran;
}
else {
cliResponse = "BadRequest";
}
}
return cliResponse;
}
/*
* Received: ! Ringing indicates that the called phone is being alerted
* SIP/2.0 180 Ringing Via: SIP/2.0/UDP 10.6.3.1:5060;branch=z9hG4bKA1798
* From: <sip:
[email protected]>;tag=105741C-1D5E To:
* <sip:
[email protected]>;tag=16777231 Date: Fri, 06 Jan 2006 5:35:10 GMT
* Call-ID:
[email protected] Timestamp:
* 1014960901 CSeq: 101 INVITE Allow: