java实现SIP一个例子.docx
《java实现SIP一个例子.docx》由会员分享,可在线阅读,更多相关《java实现SIP一个例子.docx(28页珍藏版)》请在冰点文库上搜索。
java实现SIP一个例子
java实现SIP一个例子
(如果你贴子有附件,请一定按照下面模板发贴,否则贴子会被立刻删除,谢谢合作!
)
【资料名称】:
【作者】:
【语言】:
【页数】:
【格式】:
【发表时间】:
【摘要或目录】:
(请根据需要,保留上面的相应选项)
packagecom.voip.sipphone;
importgov.nist.javax.sip.address.SipUri;
importgov.nist.javax.sip.header.CSeq;
importgov.nist.javax.sip.header.Contact;
importgov.nist.javax.sip.header.ContentLength;
importgov.nist.javax.sip.header.ContentType;
importgov.nist.javax.sip.header.From;
importgov.nist.javax.sip.header.Via;
importjava.text.ParseException;
importjava.util.ArrayList;
importjava.util.Hashtable;
importjava.util.List;
importjava.util.Properties;
importjava.util.Timer;
importjavax.sip.*;
importjavax.sip.address.Address;
importjavax.sip.address.AddressFactory;
importjavax.sip.address.URI;
importjavax.sip.header.CallIdHeader;
importjavax.sip.header.ContactHeader;
importjavax.sip.header.ExpiresHeader;
importjavax.sip.header.FromHeader;
importjavax.sip.header.Header;
importjavax.sip.header.HeaderFactory;
importjavax.sip.header.MaxForwardsHeader;
importjavax.sip.header.RecordRouteHeader;
importjavax.sip.header.ToHeader;
importjavax.sip.header.ViaHeader;
importjavax.sip.message.MessageFactory;
importjavax.sip.message.Request;
importjavax.sip.message.Response;
publicclassSipPhoneimplementsSipListener
{
publicvoidprocessDialogTerminated(DialogTerminatedEventarg0){
//TODOAuto-generatedmethodstub
System.out.println("processDialogTerminated"+arg0.toString());
}
publicvoidprocessIOException(IOExceptionEventarg0){
//TODOAuto-generatedmethodstub
System.out.println("processIOException"+arg0.toString());
}
/**
*保存当前注册的用户
*/
privatestaticHashtablecurrUser=newHashtable();
/**
*@authorsoftware
*注册定时器
*/
classTimerTaskextendsTimer
{
/**
*defaultconstructor
*/
publicTimerTask()
{
}
/**
* 如果定时任务到,则删除该用户的注册信息
*/
publicvoidrun()
{
}
}
/**
*服务器侦听IP地址
*/
privateStringipAddr="192.168.0.20";
/**
*服务器侦听端口
*/
privateintport=5060;
/**
*处理register请求
*@paramrequest请求消息
*/
privatevoidprocessRegister(Requestrequest,RequestEventrequestEvent)
{
if(null==request)
{
System.out.println("processInviterequestisnull.");
return;
}
//System.out.println("Request"+request.toString());
ServerTransactionserverTransactionId=requestEvent.getServerTransaction();
try
{
Responseresponse=null;
ToHeaderhead=(ToHeader)request.getHeader(ToHeader.NAME);
AddresstoAddress=head.getAddress();
URItoURI=toAddress.getURI();
ContactHeadercontactHeader=(ContactHeader)request.getHeader("Contact");
AddresscontactAddr=contactHeader.getAddress();
URIcontactURI=contactAddr.getURI();
System.out.println("processRegisterfrom:
"+toURI+"requeststr:
"+contactURI);
intexpires=request.getExpires().getExpires();
//如果expires不等于0,则为注册,否则为注销。
if(expires!
=0||contactHeader.getExpires()!
=0)
{
currUser.put(toURI,contactURI);
System.out.println("registeruser"+toURI);
}
else
{
currUser.remove(toURI);
System.out.println("unregisteruser"+toURI);
}
response=msgFactory.createResponse(200,request);
System.out.println("sendregisterresponse :
"+response.toString());
if(serverTransactionId==null)
{
serverTransactionId=sipProvider.getNewServerTransaction(request);
serverTransactionId.sendResponse(response);
//serverTransactionId.terminate();
System.out.println("registerserverTransaction:
"+serverTransactionId);
}
else
{
System.out.println("processRequestserverTransactionIdisnull.");
}
}
catch(ParseExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(SipExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(InvalidArgumentExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*处理invite请求
*@paramrequest请求消息
*/
privatevoidprocessInvite(Requestrequest,RequestEventrequestEvent)
{
if(null==request)
{
System.out.println("processInviterequestisnull.");
return;
}
try
{
//发送100Trying
serverTransactionId=requestEvent.getServerTransaction();
if(serverTransactionId==null)
{
serverTransactionId=sipProvider.getNewServerTransaction(request);
callerDialog=serverTransactionId.getDialog();
Responseresponse=msgFactory.createResponse(Response.TRYING,request);
serverTransactionId.sendResponse(response);
}
//查询目标地址
URIreqUri=request.getRequestURI();
URIcontactURI=currUser.get(reqUri);
System.out.println("processInviterqStr="+reqUri+"cUDP",callerVia.getBranch()+"sipphone");
//FIXME需要测试是否能够通过设置VIA头域来修改VIA头域值
cliReq.removeHeader(Via.NAME);
cliReq.addHeader(via);
//更新contact的地址
ContactHeadercontactHeader=headerFactory.createContactHeader();
Addressaddress=addressFactory.createAddress("sip:
sipsoft@"+ipAddr+":
"+port);
contactHeader.setAddress(address);
contactHeader.setExpires(3600);
cliReq.setHeader(contactHeader);
clientTransactionId=sipProvider.getNewClientTransaction(cliReq);
clientTransactionId.sendRequest();
System.out.println("processInviteclientTransactionId="+clientTransactionId.toString());
System.out.println("sendinvitetocallee:
"+cliReq);
}
catch(TransactionUnavailableExceptione1)
{
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
catch(SipExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(ParseExceptione)
{
e.printStackTrace();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
/**
*处理SUBSCRIBE请求
*@paramrequest请求消息
*/
privatevoidprocessSubscribe(Requestrequest)
{
if(null==request)
{
System.out.println("processSubscriberequestisnull.");
return;
}
ServerTransactionserverTransactionId=null;
try
{
serverTransactionId=sipProvider.getNewServerTransaction(request);
}
catch(TransactionAlreadyExistsExceptione1)
{
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}catch(TransactionUnavailableExceptione1)
{
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
try
{
Responseresponse=null;
response=msgFactory.createResponse(200,request);
if(response!
=null)
{
ExpiresHeaderexpireHeader=headerFactory.createExpiresHeader(30);
response.setExpires(expireHeader);
}
System.out.println("response:
"+response.toString());
if(serverTransactionId!
=null)
{
serverTransactionId.sendResponse(response);
serverTransactionId.terminate();
}
else
{
System.out.println("processRequestserverTransactionIdisnull.");
}
}
catch(ParseExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(SipExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(InvalidArgumentExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*处理BYE请求
*@paramrequest请求消息
*/
privatevoidprocessBye(Requestrequest,RequestEventrequestEvent)
{
if(null==request||null==requestEvent)
{
System.out.println("processByerequestisnull.");
return;
}
RequestbyeReq=null;
Dialogdialog=requestEvent.getDialog();
System.out.println("calleeDialog:
"+calleeDialog);
System.out.println("callerDialog:
"+callerDialog);
try
{
if(dialog.equals(calleeDialog))
{
byeReq=callerDialog.createRequest(request.getMethod());
ClientTransactionclientTran=sipProvider.getNewClientTransaction(byeReq);
callerDialog.sendRequest(clientTran);
calleeDialog.setApplicationData(requestEvent.getServerTransaction());
}
elseif(dialog.equals(callerDialog))
{
byeReq=calleeDialog.createRequest(request.getMethod());
ClientTransactionclientTran=sipProvider.getNewClientTransaction(byeReq);
calleeDialog.sendRequest(clientTran);
callerDialog.setApplicationData(requestEvent.getServerTransaction());
}
else
{
System.out.println("");
}
System.out.println("sendbyetopeer:
"+byeReq.toString());
}
catch(SipExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*处理CANCEL请求
*@paramrequest请求消息
*/
privatevoidprocessCancel(Requestrequest)
{
if(null==request)
{
System.out.println("processCancelrequestisnull.");
return;
}
}
/**
*处理INFO请求
*@paramrequest请求消息
*/
privatevoidprocessInfo(Requestrequest)
{
if(null==request)
{
System.out.println("processInforequestisnull.");
return;
}
}
/**
*处理ACK请求
*@paramrequest请求消息
*/
privatevoidprocessAck(Requestrequest,RequestEventrequestEvent)
{
if(null==request)
{
System.out.println("processAckrequestisnull.");
return;
}
try
{
RequestackRequest=null;
CSeqcsReq=(CSeq)request.getHeader(CSeq.NAME);
ackRequest=calleeDialog.createAck(csReq.getSeqNumber());
calleeDialog.sendAck(ackRequest);
System.out.println("sendacktocallee:
"+ackRequest.toString());
}
catch(SipExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
catch(InvalidArgumentExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*处理CANCEL消息
*@paramrequest
*@param