java实现SIP一个例子.doc_第1页
java实现SIP一个例子.doc_第2页
java实现SIP一个例子.doc_第3页
java实现SIP一个例子.doc_第4页
java实现SIP一个例子.doc_第5页
免费预览已结束,剩余19页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 stubSystem.out.println(processDialogTerminated + arg0.toString();public void processIOException(IOExceptionEvent arg0) / TODO Auto-generated method stubSystem.out.println(processIOException + arg0.toString();/* 保存当前注册的用户*/private static Hashtable currUser = new Hashtable();/* author software* 注册定时器*/class TimerTask extends Timer/* * default constructor */public TimerTask() /* *如果定时任务到,则删除该用户的注册信息 */public void run() /* 服务器侦听IP地址*/private String ipAddr = 0;/* 服务器侦听端口*/private int port = 5060;/* 处理register请求* param request 请求消息*/private void processRegister(Request request, RequestEvent requestEvent)if (null = request) System.out.println(processInvite request is null.); return;/System.out.println(Request + request.toString();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(Contact); Address contactAddr = contactHeader.getAddress(); URI contactURI = contactAddr.getURI(); System.out.println(processRegister from: + toURI + request str: + contactURI); int expires = request.getExpires().getExpires(); / 如果expires不等于0,则为注册,否则为注销。 if (expires != 0 | contactHeader.getExpires() != 0) currUser.put(toURI, contactURI); System.out.println(register user + toURI); else currUser.remove(toURI); System.out.println(unregister user + toURI); response = msgFactory.createResponse(200, request); System.out.println(send register response: + response.toString(); if(serverTransactionId = null) serverTransactionId = sipProvider.getNewServerTransaction(request); serverTransactionId.sendResponse(response); /serverTransactionId.terminate(); System.out.println(register serverTransaction: + serverTransactionId); else System.out.println(processRequest serverTransactionId is null.); 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(processInvite request is null.); 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(processInvite rqStr= + reqUri + cUDP, callerVia.getBranch()+sipphone); / FIXME 需要测试是否能够通过设置VIA头域来修改VIA头域值 cliReq.removeHeader(Via.NAME); cliReq.addHeader(via); / 更新contact的地址 ContactHeader contactHeader = headerFactory.createContactHeader(); Address address = addressFactory.createAddress(sip:sipsoft + ipAddr +:+ port); contactHeader.setAddress(address); contactHeader.setExpires(3600); cliReq.setHeader(contactHeader); clientTransactionId = sipProvider.getNewClientTransaction(cliReq); clientTransactionId.sendRequest(); System.out.println(processInvite clientTransactionId= + clientTransactionId.toString(); System.out.println(send invite to callee: + cliReq); 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(processSubscribe request is null.); 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(response : + response.toString(); if(serverTransactionId != null) serverTransactionId.sendResponse(response); serverTransactionId.terminate(); else System.out.println(processRequest serverTransactionId is null.); 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(processBye request is null.); return;Request byeReq = null;Dialog dialog = requestEvent.getDialog();System.out.println(calleeDialog : + calleeDialog);System.out.println(callerDialog : + callerDialog);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(send bye to peer: + byeReq.toString();catch (SipException e) / TODO Auto-generated catch block e.printStackTrace(); /* 处理CANCEL请求* param request 请求消息*/private void processCancel(Request request)if (null = request) System.out.println(processCancel request is null.); return;/* 处理INFO请求* param request 请求消息*/private void processInfo(Request request)if (null = request) System.out.println(processInfo request is null.); return;/* 处理ACK请求* param request 请求消息*/private void processAck(Request request, RequestEvent requestEvent)if (null = request) System.out.println(processAck request is null.); return;try Request ackRequest = null; CSeq csReq = (CSeq)request.getHeader(CSeq.NAME); ackRequest = calleeDialog.createAck(csReq.getSeqNumber(); calleeDialog.sendAck(ackRequest); System.out.println(send ack to callee: + ackRequest.toString();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(processCancel input parameter invalid.); 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(processRequest request is null.); return;System.out.println(processRequest: + request.toString();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(no support the method!);/* 主叫对话*/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(send bye response to peer: + byeResp.toString();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(recv the response : +response.toString();System.out.println(respone to request : + arg0.getClientTransaction().getRequest();if (response.getStatusCode() = Response.TRYING) System.out.println(The response is 100 response.); 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(sip:sipsoft+ipAddr+:+port); 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(the sdp contenttype is + contentType); callerResp.setContentLength(contentLen); /callerResp.addHeader(contentType); callerResp.setContent(response.getContent(), contentType); else System.out.println(sdp is null.); if (serverTransactionId != null) callerDialog = serverTransactionId.getDialog(); calleeDialog = clientTran.getDialog(); serverTransactionId.sendResponse(callerResp); System.out.println(callerDialog= + callerDialog); System.out.println(serverTransactionId.branch= + serverTransactionId.getBranchId(); else System.out.println(serverTransactionId is null.); System.out.println(send response to caller : + callerResp.toString(); 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论