前久在用mjsip开发sip客户端的时候遇到401和407问题被卡了几天,所以在这做个记录。401我的解决是在注册失败并收到401错误时,把服务器返回的信息重新组装一次,再请求一次,部分代码如下:
if (code==401) {
Message req=transaction.getRequestMessage();
req.setCSeqHeader(req.getCSeqHeader().incSequenceNumber());
WwwAuthenticateHeader wah=resp.getWwwAuthenticateHeader();
String qop_options=wah.getQopOptionsParam();
printLog("DEBUG: qop-options: "+qop_options,LogLevel.MEDIUM);
qop=(qop_options!=null)? "auth" : null;
AuthorizationHeader ah=(new DigestAuthentication(SipMethods.REGISTER,req.getRequestLine().getAddress().toString(),wah,qop,null,username,passwd)).getAuthorizationHeader();
req.setAuthorizationHeader(ah);
TransactionClient t=new TransactionClient(sip_provider,req,this);
t.request();
}
同样的方式解决407问题,所不同的是在发出invite后要回应一个ack信息,代码如下:
if(code==407){
Message ack = MessageFactory.createRequest(sip_provider, SipMethods.ACK, to, from, null);
ack.setCallIdHeader(req.getCallIdHeader());
TransactionClient t=new TransactionClient(sip_provider,ack,this);
t.request();
}
if ((code==407)){
req.setCSeqHeader(req.getCSeqHeader().incSequenceNumber());
WwwAuthenticateHeader wah;
wah=msg.getProxyAuthenticateHeader();
String qop_options=wah.getQopOptionsParam();
qop=(qop_options!=null)? "auth" : null;
RequestLine rl=req.getRequestLine();
DigestAuthentication digest=new DigestAuthentication(rl.getMethod(),rl.getAddress().toString(),wah,qop,null,username,password);
AuthorizationHeader ah;
ah=digest.getProxyAuthorizationHeader();
req.setAuthorizationHeader(ah);
transactions.remove(tc.getTransactionId());
tc=new TransactionClient(sip_provider,req,this);
transactions.put(tc.getTransactionId(),tc);
tc.request();
}
分享到:
相关推荐
本文将深入探讨在使用MJSIP时可能会遇到的401和407错误,以及如何通过源码理解和解决这些问题。 401 Unauthorized和407 Proxy Authentication Required是HTTP状态代码,它们在SIP协议中也有类似的应用。在SIP通信中...
4. **社区支持**:mjsip拥有活跃的开发者社区,能够及时获取技术支持和解决问题。 ### 结论 mjsip作为一款优秀的SIP库,不仅提供了标准的SIP实现,还通过其高级接口和参考实现,极大地简化了SIP应用的开发过程。...
- **第五部分**:用户认证和行为设置。 - `from_url`:SIP协议中的发送者字段,格式为`sip:username@url`。 - `username`:由VoIP服务提供商提供的用户名。 - `passwd`:由VoIP服务提供商提供的用户密码。 - `...
MjSip是一个Java语言实现的SIP(Session Initiation Protocol)协议栈,适用于初学者进行SIP相关应用和服务的开发。它遵循RFC3261标准,提供了一个灵活且层次化的架构,允许开发者轻松创建SIP基础应用。MjSip的核心...
本文将深入探讨一个基于P2P(Peer-to-Peer)技术和SIP(Session Initiation Protocol)协议的Java通信软件项目——"p2psip_base on mjsip"。这个项目的核心在于利用P2P的分布式特性与SIP的通信规范,构建了一个高效...
7. **部署与调试**:部署mjsip涉及配置服务器、设置用户认证、网络拓扑优化等多个环节。同时,开发者需要学会使用日志和调试工具来排查问题,确保系统的稳定运行。 8. **社区支持与持续发展**:作为开源项目,mjsip...
【mjsip2me架包及源码】是一款专为J2ME平台设计的SIP(Session Initiation Protocol)客户端开发资源,包含了完整的库文件和源代码,方便开发者进行通信应用的构建。SIP是一种互联网协议,用于控制多媒体通信会话,...
* Mjsip contributing the original stack, * initial port to Android emulator and development of a Test SIP Client by Hughes Systique Corporation. i-p-tel GmbH, the founder of this project, ported ...
这个压缩包的核心内容是关于如何在iOS应用开发中构建网络服务,以便实现数据的交换和通信。 【描述】"亲测可用"表明这些代码已经被验证过,能够正常工作,这为开发者提供了信心,他们可以参考和学习这些代码来搭建...
未来的研究方向可以进一步探索如何在更大的网络规模下,提高系统的资源分配效率和响应速度,以应对日益增长的视频传输需求。 关键词:信令控制,MjSip,混合式P2P,Chord,JXTA 通过上述分析,可以看出,基于SIP和...
STUN是一种网络协议,它允许位于NAT后的客户端发现其公网地址和端口,并且判断其NAT类型,从而帮助实现SIP的穿越NAT问题。 此外,针对无线视频通信的特殊需求,如质量容忍度低,高丢包率等问题,文档中提出了调节丢...
在这个项目中,mjsip库很可能被用来处理语音通话的建立和管理,包括拨号、接听、挂断等操作。 3. **WalkieTalkie**:这是Android客户端应用程序的源代码,包含UI设计、用户交互逻辑和音频处理等部分。客户端需要...
Universtita的degli Studi di Parma DSG-分布式系统组Sip2Peer内容:-config:对等配置文件-doc:sip2peer java doc -lib:MjSIP和本地服务器-scriptPython:运行示例代码的Python脚本-src:源代码为了运行示例对等...
A MjSip-based server implementation is also available. It can be used as Registrar, Redirect, Stateless Proxy or Stateful Proxy.
Copyright (C) 2005 Luca Veltri - University of Parma - Italy (http://mjsip.org) This file is part of Sipdroid (http://www.sipdroid.org) Sipdroid is free software; you can redistribute it and/or
是MyJavaSIP1.7在eclipse中...If you are interested in all java source files of the mjsip stack (v1.7) and reference applications (mjProxy v1.7, mjSBC v1.7, and mjUA v1.7), you can download them from here
mjsip_1.6 .........\changes.txt .........\classes .........\lib .........\...\COPYRIGHT.txt .........\...\license.txt .........\...\server.jar .........\...\sip.jar .........\...\ua....