java实现SIP一个例子
更新时间:2024-06-20 03:18:02 阅读量: 综合文库 文档下载
java实现SIP一个例子
(如果你贴子有附件,请一定按照下面模板发贴,否则贴子会被立刻删除,谢谢合作!)
【资料名称】: 【作者】: 【语言】: 【页数】: 【格式】: 【发表时间】: 【摘要或目录】:
(请根据需要,保留上面的相应选项)
package com.voip.sipphone;
import gov.nist.javax.sip.address.SipUri; import gov.nist.javax.sip.header.CSeq; import gov.nist.javax.sip.header.Contact; import gov.nist.javax.sip.header.ContentLength; import gov.nist.javax.sip.header.ContentType;
import gov.nist.javax.sip.header.From; import gov.nist.javax.sip.header.Via; import java.text.ParseException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Properties; import java.util.Timer; import javax.sip.*;
import javax.sip.address.Address; import javax.sip.address.AddressFactory;
import javax.sip.address.URI; import javax.sip.header.CallIdHeader; import javax.sip.header.ContactHeader; import javax.sip.header.ExpiresHeader; import javax.sip.header.FromHeader; import javax.sip.header.Header; import javax.sip.header.HeaderFactory; import javax.sip.header.MaxForwardsHeader;
import javax.sip.header.RecordRouteHeader;
import javax.sip.header.ToHeader; import javax.sip.header.ViaHeader; import javax.sip.message.MessageFactory;
import javax.sip.message.Request; import javax.sip.message.Response; public class SipPhone implements SipListener
{
public void processDialogTerminated(DialogTerminatedEvent arg0) {
// TODO Auto-generated method stub
System.out.println(\
}
public void processIOException(IOExceptionEvent arg0) {
// TODO Auto-generated method stub
System.out.println(\
} /**
* 保存当前注册的用户
*/
private static Hashtable
/**
* @author software
* 注册定时器
*/
class TimerTask extends Timer
{ /**
* default constructor
*/
public TimerTask()
{
} /**
* 如果定时任务到,则删除该用户的注册信息
*/
public void run()
{ } } /**
* 服务器侦听IP地址
*/
private String ipAddr = \
/**
* 服务器侦听端口
*/
private int port = 5060;
/**
* 处理register请求 * @param request 请求消息
*/
private void processRegister(Request request, RequestEvent requestEvent)
{
if (null == request)
{
System.out.println(\
return;
}
//System.out.println(\
ServerTransaction serverTransactionId = requestEvent.getServerTransaction();
try {
Response response = null;
ToHeader head = (ToHeader)request.getHeader(ToHeader.NAME);
Address toAddress = head.getAddress();
URI toURI = toAddress.getURI();
ContactHeader contactHeader = (ContactHeader) request.getHeader(\
Address contactAddr = contactHeader.getAddress();
URI contactURI = contactAddr.getURI();
System.out.println(\
contactURI);
int expires = request.getExpires().getExpires(); // 如果expires不等于0,则为注册,否则为注销。 if (expires != 0 || contactHeader.getExpires() != 0)
{
currUser.put(toURI, contactURI);
System.out.println(\
} else {
currUser.remove(toURI);
System.out.println(\
}
response = msgFactory.createResponse(200, request);
System.out.println(\
if(serverTransactionId == null)
{
serverTransactionId = sipProvider.getNewServerTransaction(request);
serverTransactionId.sendResponse(response);
//serverTransactionId.terminate();
System.out.println(\
} else {
System.out.println(\
} }
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 处理invite请求 * @param request 请求消息
*/
private void processInvite(Request request, RequestEvent requestEvent)
{
if (null == request)
{
System.out.println(\
return;
}
try {
// 发送100 Trying
serverTransactionId = requestEvent.getServerTransaction();
if (serverTransactionId == null)
{
serverTransactionId = sipProvider.getNewServerTransaction(request);
callerDialog = serverTransactionId.getDialog();
Response response = msgFactory.createResponse(Response.TRYING, request);
serverTransactionId.sendResponse(response);
}
//查询目标地址
URI reqUri = request.getRequestURI(); URI contactURI = currUser.get(reqUri);
System.out.println(\
callerVia.getBranch()+\
// FIXME 需要测试是否能够通过设置VIA头域来修改VIA头域值
cliReq.removeHeader(Via.NAME);
cliReq.addHeader(via);
// 更新contact的地址
ContactHeader contactHeader = headerFactory.createContactHeader(); Address address = addressFactory.createAddress(\
port);
contactHeader.setAddress(address); contactHeader.setExpires(3600); cliReq.setHeader(contactHeader);
clientTransactionId = sipProvider.getNewClientTransaction(cliReq);
clientTransactionId.sendRequest();
System.out.println(\
clientTransactionId.toString());
System.out.println(\
}
catch (TransactionUnavailableException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ParseException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
} } /**
* 处理SUBSCRIBE请求 * @param request 请求消息
*/
private void processSubscribe(Request request)
{
if (null == request)
{
System.out.println(\
return;
}
ServerTransaction serverTransactionId = null;
try {
serverTransactionId = sipProvider.getNewServerTransaction(request);
}
catch (TransactionAlreadyExistsException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (TransactionUnavailableException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
} try {
Response response = null;
response = msgFactory.createResponse(200, request);
if (response != null)
{
ExpiresHeader expireHeader = headerFactory.createExpiresHeader(30);
response.setExpires(expireHeader);
}
System.out.println(\
if(serverTransactionId != null)
{
serverTransactionId.sendResponse(response);
serverTransactionId.terminate();
} else {
System.out.println(\
}
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 处理BYE请求 * @param request 请求消息
*/
private void processBye(Request request, RequestEvent requestEvent)
{
if (null == request || null == requestEvent)
{
System.out.println(\
return;
}
Request byeReq = null;
Dialog dialog = requestEvent.getDialog();
System.out.println(\ System.out.println(\
try {
if (dialog.equals(calleeDialog))
{
byeReq = callerDialog.createRequest(request.getMethod());
ClientTransaction clientTran = sipProvider.getNewClientTransaction(byeReq);
callerDialog.sendRequest(clientTran);
calleeDialog.setApplicationData(requestEvent.getServerTransaction());
}
else if (dialog.equals(callerDialog))
{
byeReq = calleeDialog.createRequest(request.getMethod());
ClientTransaction clientTran = sipProvider.getNewClientTransaction(byeReq);
calleeDialog.sendRequest(clientTran);
callerDialog.setApplicationData(requestEvent.getServerTransaction());
} else {
System.out.println(\
}
System.out.println(\
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 处理CANCEL请求 * @param request 请求消息
*/
private void processCancel(Request request)
{
if (null == request)
{
System.out.println(\
return;
} } /**
* 处理INFO请求 * @param request 请求消息
*/
private void processInfo(Request request)
{
if (null == request)
{
System.out.println(\
return;
} } /**
* 处理ACK请求 * @param request 请求消息
*/
private void processAck(Request request, RequestEvent requestEvent)
{
if (null == request)
{
System.out.println(\
return;
} try {
Request ackRequest = null;
CSeq csReq = (CSeq)request.getHeader(CSeq.NAME); ackRequest = calleeDialog.createAck(csReq.getSeqNumber());
calleeDialog.sendAck(ackRequest);
System.out.println(\
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 处理CANCEL消息 * @param request * @param requestEvent
*/
private void processCancel(Request request, RequestEvent requestEvent)
{
// 判断参数是否有效
if (request == null || requestEvent == null)
{
System.out.println(\
return;
} try {
// 发送CANCEL 200 OK消息
Response response = msgFactory.createResponse(Response.OK, request); ServerTransaction cancelServTran = requestEvent.getServerTransaction();
if (cancelServTran == null)
{
cancelServTran = sipProvider.getNewServerTransaction(request);
}
cancelServTran.sendResponse(response);
// 向对端发送CANCEL消息 Request cancelReq = null;
Request inviteReq = clientTransactionId.getRequest();
List list = new ArrayList();
Via viaHeader = (Via)inviteReq.getHeader(Via.NAME);
list.add(viaHeader);
CSeq cseq = (CSeq)inviteReq.getHeader(CSeq.NAME);
CSeq cancelCSeq = (CSeq)headerFactory.createCSeqHeader(cseq.getSeqNumber(),
Request.CANCEL);
cancelReq = msgFactory.createRequest(inviteReq.getRequestURI(),
inviteReq.getMethod(),
(CallIdHeader)inviteReq.getHeader(CallIdHeader.NAME),
cancelCSeq,
(FromHeader)inviteReq.getHeader(From.NAME), (ToHeader)inviteReq.getHeader(ToHeader.NAME),
list,
(MaxForwardsHeader)inviteReq.getHeader(MaxForwardsHeader.NAME));
ClientTransaction cancelClientTran = sipProvider.getNewClientTransaction(cancelReq);
cancelClientTran.sendRequest();
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (TransactionAlreadyExistsException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (TransactionUnavailableException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }
private ServerTransaction serverTransactionId = null;
/* (non-Javadoc)
* @see javax.sip.SipListener#processRequest(javax.sip.RequestEvent)
*/
public void processRequest(RequestEvent arg0)
{
Request request = arg0.getRequest();
if (null == request)
{
System.out.println(\
return;
}
System.out.println(\
if (Request.INVITE.equals(request.getMethod()))
{
processInvite(request, arg0);
}
else if (Request.REGISTER.equals(request.getMethod()))
{
processRegister(request, arg0);
}
else if (Request.SUBSCRIBE.equals(request.getMethod()))
{
processSubscribe(request);
}
else if (Request.ACK.equalsIgnoreCase(request.getMethod()))
{
processAck(request, arg0);
}
else if (Request.BYE.equalsIgnoreCase(request.getMethod()))
{
processBye(request, arg0);
}
else if (Request.CANCEL.equalsIgnoreCase(request.getMethod()))
{
processCancel(request, arg0);
} else {
System.out.println(\
} } /** * 主叫对话
*/
private Dialog calleeDialog = null;
/** * 被叫对话
*/
private Dialog callerDialog = null;
/** * */
ClientTransaction clientTransactionId = null;
/**
* 处理BYE响应消息 * @param reponseEvent
*/
private void doByeResponse(Response response, ResponseEvent responseEvent)
{
Dialog dialog = responseEvent.getDialog();
try {
Response byeResp = null; if (callerDialog.equals(dialog))
{
ServerTransaction servTran =
(ServerTransaction)calleeDialog.getApplicationData();
byeResp = msgFactory.createResponse(response.getStatusCode(),
servTran.getRequest());
servTran.sendResponse(byeResp);
}
else if (calleeDialog.equals(dialog))
{
ServerTransaction servTran =
(ServerTransaction)callerDialog.getApplicationData();
byeResp = msgFactory.createResponse(response.getStatusCode(),
servTran.getRequest());
servTran.sendResponse(byeResp);
} else { }
System.out.println(\
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace(); } catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }
/* (non-Javadoc)
* @see javax.sip.SipListener#processResponse(javax.sip.ResponseEvent)
* */
public void processResponse(ResponseEvent arg0)
{
// FIXME 需要判断各个响应对应的是什么请求 Response response = arg0.getResponse();
System.out.println(\
System.out.println(\
arg0.getClientTransaction().getRequest());
if (response.getStatusCode() == Response.TRYING)
{
System.out.println(\
return;
} try {
ClientTransaction clientTran = (ClientTransaction)
arg0.getClientTransaction();
if (Request.INVITE.equalsIgnoreCase(clientTran.getRequest().getMethod()))
{
int statusCode = response.getStatusCode();
Response callerResp = null;
callerResp = msgFactory.createResponse(statusCode,
serverTransactionId.getRequest());
// 更新contact头域值,因为后面的消息是根据该URI来路由的 ContactHeader contactHeader = headerFactory.createContactHeader();
Address address =
addressFactory.createAddress(\
contactHeader.setAddress(address); contactHeader.setExpires(3600); callerResp.addHeader(contactHeader);
// 拷贝to头域
ToHeader toHeader = (ToHeader)response.getHeader(ToHeader.NAME);
callerResp.setHeader(toHeader);
// 拷贝相应的消息体
ContentLength contentLen = (ContentLength)response.getContentLength();
if (contentLen != null && contentLen.getContentLength() != 0)
{
ContentType contentType =
(ContentType)response.getHeader(ContentType.NAME);
System.out.println(\
callerResp.setContentLength(contentLen); //callerResp.addHeader(contentType);
callerResp.setContent(response.getContent(), contentType);
} else {
System.out.println(\
}
if (serverTransactionId != null)
{
callerDialog = serverTransactionId.getDialog();
calleeDialog = clientTran.getDialog(); serverTransactionId.sendResponse(callerResp); System.out.println(\ System.out.println(\
serverTransactionId.getBranchId());
} else {
System.out.println(\
}
System.out.println(\
}
else if (Request.BYE.equalsIgnoreCase(clientTran.getRequest().getMethod()))
{
doByeResponse(response, arg0);
} else if
(Request.CANCEL.equalsIgnoreCase(clientTran.getRequest().getMethod()))
{
//doCancelResponse(response, arg0);
} else { } }
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
} }
private void doCancelResponse(Response response, ResponseEvent responseEvent)
{
//FIXME 需要验证参数的有效性 ServerTransaction servTran =
(ServerTransaction)callerDialog.getApplicationData();
Response cancelResp;
try {
cancelResp = msgFactory.createResponse(response.getStatusCode(),
servTran.getRequest());
servTran.sendResponse(cancelResp);
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (SipException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvalidArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} }
public void processTimeout(TimeoutEvent arg0)
{
// TODO Auto-generated method stub
System.out.println(\
}
public void processTransactionTerminated(TransactionTerminatedEvent arg0) {
// TODO Auto-generated method stub
System.out.println(\
arg0.getClientTransaction().getBranchId()
+ \
}
private static SipStack sipStack = null;
private static AddressFactory addressFactory = null;
private static MessageFactory msgFactory = null;
private static HeaderFactory headerFactory = null;
private static SipProvider sipProvider = null;
private void init()
{
SipFactory sipFactory = null;
sipFactory = SipFactory.getInstance();
if (null == sipFactory)
{
System.out.println(\
return;
}
sipFactory.setPathName(\ Properties properties = new Properties();
properties.setProperty(\ // You need 16 for logging traces. 32 for debug + traces. // Your code will limp at 32 but it is best for debugging. properties.setProperty(\
properties.setProperty(\
\
properties.setProperty(\
\
try {
sipStack = sipFactory.createSipStack(properties);
}
catch (PeerUnavailableException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return;
} try {
headerFactory = sipFactory.createHeaderFactory(); addressFactory = sipFactory.createAddressFactory(); msgFactory = sipFactory.createMessageFactory();
ListeningPoint lp = sipStack.createListeningPoint(\
5060, \ SipPhone listener = this;
sipProvider = sipStack.createSipProvider(lp);
System.out.println(\
sipProvider.addSipListener(listener);
}
catch (Exception ex)
{
ex.printStackTrace();
return;
} } /** * 程序入口 * @param args
*/ public static void main(String []args) { new SipPhone().init(); } }
正在阅读:
java实现SIP一个例子06-20
江苏省启东市高考物理总复习牛顿运动定律、牛顿运动定律的应用超重和失重牛顿运动定律的应用练习(10)12-03
《科研方法与论文写作》-扬州市专技人员继续教育考试试卷大全01-20
中国古代诗歌发展简史02-02
宗教突发事件应急工作预案11-10
2014-2022年中国胶原蛋白行业深度调研与投资前景预测报告04-22
关于小学教师政治学习个人心得体会八篇08-04
进程同步模拟设计 - 哲学家就餐问题03-18
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 例子
- 实现
- 一个
- java
- SIP
- 松下集团电话交换机疑难解答889
- 学习人宇科学的认识和体会3 - - 水滴
- 《上市公司财务报表粉饰及其案例分析》
- 深圳市市场监督管理局1答案
- 实验报告四
- 社会学系本科百本推荐阅读书目
- 2019年中国家用医疗器械市场深度研究与行业发展趋势报告目录
- 鲁迅小说研究(笔记)
- 第七课 简单的动画补间动画和丰富的补间动画
- 2017-2018学年陕西省咸阳市百灵中学高一(上)第一次月考数学试
- 动物生化习题集附历年考研题(东北农大)
- 综合布线系统工程设计方案书
- 意外死亡事件处理指引
- HTD-8M同步带轮尺寸表
- (新)教科版《道德与法治》二年级上册第8课《认识标志,远离危
- 2017组工干部对照检查材料
- 2018年公司三八妇女节的活动总结
- 电子技能实训教学大纲
- 登封市2011年中小学“班班通”工程实施方案1
- 2010年教师资格证考试教育心理学百题精选