HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 各位網(wǎng)友大家好: 最近在使用sipml5 sip client軟件來調(diào)試 asterisk 基本功能(已經(jīng)使用 X-Lite 客戶端軟件實(shí)現(xiàn)電話 呼叫 ,電話 會(huì)議 ,視頻電話,單一視頻源視頻會(huì)議).asterisk服務(wù)器和 客戶端 都在內(nèi)網(wǎng)。asterisk服務(wù)器ip地址為:192.168.1.187; asterisk對webrtc支持配置 參考官網(wǎng): https://wiki.asterisk.org/wiki/display/AST/Asterisk+WebRTC+Support
CSDN博客: http://blog.csdn.net/chengzhangbiji/article/details/40350997
1、http.conf配置
enabled = yes bindport = 8088 bindaddr = 0.0.0.0
2、rtp.conf配置
[general] rtpstart=10000 rtpend=20000 icesupport=yes stunaddr=stun.l.google.com:19302
3、生產(chǎn)webrtc證書,參考網(wǎng)站: https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Tutorial
原文中對生成webrtc證書配置如下:
mkdir /etc/asterisk/keys //asterisk服務(wù)器證書生成 ./ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys -C選項(xiàng)定義我們的主機(jī)- DNS名稱或IP地址,是否需要修改為asterisk服務(wù)器地址,不確定 //siml5客戶端證書生成 ./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C phone1.mycompany.com -O "My Super Company" -d /etc/asterisk/keys -o malcolm -C選項(xiàng)是否修改為客戶端ip地址,不太確定 -o選項(xiàng)是否修改為6001號碼同名,也不知道 以上命令全部使用官網(wǎng)原命令。 將生成的 malcolm.pem and ca.crt文件拷貝到sipml5客戶端目錄下。
4、sip.conf配置
[general] srvlookup = yes videosupport = yes maxcallbitrate = 384 allowoverlap=no ; Disable overlap dialing support. (Default is yes) udpbindaddr = 0.0.0.0:5060 realm = 192.168.1.187 [6001] ;sipml5客戶端號碼 host=dynamic secret=6001 context=internal type=friend encryption=yes avpf=yes force_avp=yes icesupport=yes directmedia=no disallow=all allow=ulaw dtlsenable=yes dtlsverify=fingerprint dtlscertfile=/etc/asterisk/keys/asterisk.pem dtlscafile=/etc/asterisk/keys/ca.crt dtlssetup=actpass nat = yes transport = ws,wss [2002] ;xlite客戶端號碼 secret = 2002 port = 5060 type = friend host = dynamic qualify = yes nat = no context = internal canreinvite = yes fullname = cuiyj allow = h263p transport = udp 5、pjsip.conf配置
[transport-ws] type=transport protocol=ws bind=0.0.0.0 [6001] type=aor max_contacts=2 remove_existing=yes [6001] type=auth auth_type=userpass password=6001 username=6001 [6001] type=endpoint disallow=all allow=ulaw context=default auth=6001 aors=6001 media_encryption=dtls dtls_verify=fingerprint dtls_cert_file=/etc/asterisk/keys/asterisk.pem dtls_ca_file=/etc/asterisk/keys/ca.crt dtls_setup=actpass use_avpf=yes ice_support=yes media_use_received_transport=yes 6、重啟asterisk服務(wù)器
systemctl stop asterisk.service
systemctl start asterisk.service 7、客戶端登錄 將sipml5 sip client設(shè)為6001分機(jī) , 登錄信息如下所示:
配置ok。點(diǎn)擊“l(fā)ogin”登錄,控制臺打?。?
WebSocket connection from '192.168.1.154:51785' for protocol 'sip' accepted using version '13' -- Registered SIP '6001' at 192.168.1.154:51785 > Saved useragent "IM-client/OMA1.0 sipML5-v1.2016.03.04" for peer 6001 登錄ok。xlite登錄不在貼出。
8、電話互打
(1) 使用sipml5撥打xlite客戶端 , 調(diào)試信息如下:
通話正常。
(2) 使用xlite撥打sipml5客戶端 ,調(diào)試信息如下:
sipml5客戶端響鈴,接通之后馬上斷掉,其中出現(xiàn)錯(cuò)誤:
DTLS failure occurred on RTP instance '0x7f462000fff8' due to reason 'missing tmp ecdh key', terminating
9、 問題分析
猜測可能是step 3,生成webrtc證書有誤,所以將其修改為:
mkdir /etc/asterisk/keys //asterisk服務(wù)器證書生成 ./ast_tls_cert -C 192.168.1.187 -O "My Super Company" -d /etc/asterisk/keys //siml5客戶端證書生成 ./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C 192.168.1.154 -O "My Super Company" -d /etc/asterisk/keys -o 6001 將6001 .pem and ca.crt拷貝到sipml5客戶端目錄下。 重新登錄,繼續(xù)step 8.2 使用xlite撥打sipml5客戶端,出現(xiàn)了同樣的錯(cuò)誤。
請教一下各位大神,問題出現(xiàn)在哪里呢??
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 問題1: 主叫被叫顯示同號。如何讓主叫分機(jī)顯示被叫分機(jī)號碼,被叫分機(jī)顯示主叫分機(jī)號碼? 問題2: 如何使用ami管理接口 會(huì)議 室 創(chuàng)建會(huì)議室 ,并邀請其他用戶加入到會(huì)議室當(dāng)中? 各位Asterisk好友大家好,最近在學(xué)習(xí)ami管理接口,目前遇到兩個(gè)棘手的問題,想請教一下: 問題1 : 主叫被叫顯示同號。如何讓主叫分機(jī)顯示被叫分機(jī)號碼,被叫分機(jī)顯示主叫分機(jī)號碼? 部分代碼如下: originateAction = new OriginateAction(); originateAction.setChannel("SIP/1001"); //呼叫連接通道, 呼叫 時(shí),先呼通自己 主叫用戶 originateAction.setContext("internal"); //設(shè)置路由器 originateAction.setPriority(new Integer(1)); //設(shè)置優(yōu)先級 originateAction.setExten("1002"); //被呼叫號碼, 被叫 originateAction.setTimeout(new Long(30000)); //設(shè)置 呼叫等待 時(shí)間 originateAction.setCallerId("1234"); //呼叫號碼 呼叫結(jié)果: 主叫1001先被呼叫,接通之后,呼叫1002分機(jī)。但是 主叫和被叫都顯示來電號碼為1234 。 代碼修改: 鑒于 originateAction.setCallerId("1234"); 這段代碼是用來顯示被叫號碼,但是將主叫和被叫統(tǒng)統(tǒng)顯示為1234同一個(gè)號碼,實(shí)際應(yīng)用肯定不行。
將此代碼屏蔽之后再編譯運(yùn)行。
結(jié)果 主叫顯示“Anonymous”號碼, 被叫顯示“Asterisk”號碼 。 想請教各位一下,如何設(shè)置 讓其主叫分機(jī)顯示被叫分機(jī)號碼,被叫分機(jī)顯示主叫分機(jī)號碼???? 問題2: 如何使用ami管理接口創(chuàng)建會(huì)議室,并邀請其他用戶加入到會(huì)議室呢? 我在看了ami管理接口之后有個(gè)疑問想請教一下: Originate接口可以實(shí)現(xiàn)電話呼叫。 Confbridge系列的接口可以實(shí)現(xiàn)會(huì)議管理, 那么創(chuàng)建一個(gè)會(huì)議室,邀請其他用戶加入到會(huì)議室這些最基本操作在哪個(gè)接口? 非常期待您的解惑,感激不盡??!
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
各位網(wǎng)友大家好,我在運(yùn)行asterisk-java官網(wǎng)例子時(shí)出現(xiàn)錯(cuò)誤。
asterisk服務(wù)器ip地址:192.168.1.171
manager.conf文件配合為:
-----------------------------------
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[manager]
secret=password
permit=0.0.0.0/0.0.0.0
read=system,call,log,verbose,agent,command,user
write=system,call,log,verbose,agent,command,user
-----------------------------------
使用telnet命令訪問沒有問題。
在另一個(gè)windows電腦上使用Eclipse創(chuàng)建工程,導(dǎo)入包:asterisk-java-1.0.0-m1.jar
拷貝asterisk-java官網(wǎng)例子,HelloManager.java,并修改訪問ip和用戶密碼,代碼如下:
------------------------------------------------------
import java.io.IOException;
import org.asteriskjava.manager.AuthenticationFailedException;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.OriginateAction;
import org.asteriskjava.manager.response.ManagerResponse;
public class HelloManager
{
private ManagerConnection managerConnection;
public HelloManager() throws IOException
{
ManagerConnectionFactory factory = new ManagerConnectionFactory(
"192.168.1.171", "manager", "password");
this.managerConnection = factory.createManagerConnection();
}
public void run() throws IOException, AuthenticationFailedException,
TimeoutException
{
OriginateAction originateAction;
ManagerResponse originateResponse;
// connect to Asterisk and log in
originateAction = new OriginateAction();
originateAction.setChannel("SIP/1001");
originateAction.setContext("default");
originateAction.setExten("1300");
originateAction.setPriority(new Integer(1));
originateAction.setTimeout(new Long(30000));
managerConnection.login();
// send the originate action and wait for a maximum of 30 seconds for Asterisk
// to send a reply
originateResponse = managerConnection.sendAction(originateAction, 30000);
// print out whether the originate succeeded or not
System.out.println(originateResponse.getResponse());
// and finally log off and disconnect
managerConnection.logoff();
}
public static void main(String[] args) throws Exception
{
HelloManager helloManager;
helloManager = new HelloManager();
helloManager.run();
}
}
----------------------------------------------------
Eclipse編譯運(yùn)行:出現(xiàn)如下錯(cuò)誤:
十二月 10, 2016 1:41:12 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl connect
信息: Connecting to 192.168.1.171:5038
十二月 10, 2016 1:41:12 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl setProtocolIdentifier
信息: Connected via Asterisk Call Manager/3.1.0
十二月 10, 2016 1:41:12 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl setProtocolIdentifier
警告: Unsupported protocol version 'Asterisk Call Manager/3.1.0'. Use at your own risk.
十二月 10, 2016 1:41:13 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin
信息: Successfully logged in
十二月 10, 2016 1:41:13 下午 org.asteriskjava.manager.internal.EventBuilderImpl buildEvent
信息: No event class registered for event type 'fullybooted', attributes: {lastreload=4340, privilege=system,all, event=FullyBooted, uptime=4340, status=Fully Booted}
十二月 10, 2016 1:41:13 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin
信息: Determined Asterisk version: Asterisk 1.0
Error
十二月 10, 2016 1:41:13 下午 org.asteriskjava.manager.internal.ManagerConnectionImpl disconnect
信息: Closing socket.
十二月 10, 2016 1:41:13 下午 org.asteriskjava.manager.internal.ManagerReaderImpl run
信息: Terminating reader thread: No more lines available: null
請各位朋友幫幫忙,感激不盡。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
請教各位朋友一個(gè)問題:
為什么SIP用戶作為主叫用戶和被叫用戶時(shí),呼叫流程不一樣呢?
SIP用戶作為主叫
SIP用戶作為被叫
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
我最早在三年前接觸的asterisk,那時(shí)候asterisk已經(jīng)有不小的市場占有率了。最早是看《asteirsk電話未來之路》慢慢了解asteirsk的。
Asterisk十分強(qiáng)大,基本上我能想到的電話系統(tǒng)功能,它都能夠提供。 我曾經(jīng)自己從安裝asterisk,zaptel開始,自己寫配置文件,自己安裝硬件接口卡,硬是給公司搭了一臺IPPBX,當(dāng)然,公司用到的都是些基本 的應(yīng)用。像內(nèi)部分機(jī)互打,呼叫轉(zhuǎn)移,截答。限制呼叫國際長途啊等等。
后來試過Trixbox和Elastix
Trixbox: Centos + 基于FreePBX的web配置頁面 + asterisk + TDM板卡
安裝相對簡單,功能強(qiáng)大,配置比較復(fù)雜,一般需要專業(yè)的工程師才能完成配置。特別是要安裝傳統(tǒng)電話接口卡(FXO,FXS,BRI,PRI等)時(shí), 市場上各種各樣的接口卡,經(jīng)常有這樣那樣的問題。而且asterisk有幾個(gè)比較嚴(yán)重的bug,如網(wǎng)絡(luò)有問題時(shí),整個(gè)asteirsk會(huì)卡死在那邊,這時(shí) 候即使是內(nèi)部分機(jī)也互打不了,這個(gè)問題在公司出現(xiàn)好幾次,后面領(lǐng)導(dǎo)發(fā)話,非得換掉這個(gè)系統(tǒng)不可。后面在網(wǎng)上找了一些IPPBX廠商,國外的品牌非常貴,國 內(nèi)的很多也不知道質(zhì)量怎樣。后面聽朋友介紹,買了億群的MyPBX回來測試。買的是standard型號,可以支持GSM模塊,剛好我們比較經(jīng)常用到手 機(jī),就買了兩個(gè)模塊回來試試。
MyPBX: 6 FXO(3個(gè)模塊) + 2 FXS(1個(gè)模塊) + 2 GSM(兩個(gè)模塊)
想不到MyPXB也是基于asterisk的,用的是Blackfin的CPU,內(nèi)存128MB,有512MB的flash用于存儲語音留言和錄 音,感覺配置還行,因?yàn)槲覀円蟛桓?系統(tǒng)穩(wěn)定,不要?jiǎng)硬粍?dòng)需要重啟就好了。接下來就是配置了,MyPBX的用戶界面真的挺不錯(cuò),呼入路由,呼出路由,分 機(jī)界面都沒得說,還支持SRTP, SIP(TCP,TLS)。最讓我感到意外的是,居然集成了防火墻功能?。∵@個(gè)太需要了,之前就是被攻擊了,VoIP帳號被盜,導(dǎo)致公司損失了2萬塊錢! 還別說,這個(gè)防火墻還有模有樣,可以配置相對嚴(yán)密的防護(hù)規(guī)則。配置界面還挺友好的。我很快就完成配置了,呼入呼出路由,防火墻,改了分機(jī)密碼,注冊了 SIP trunk,用它提供的autoprovision功能,配置了公司36臺IP話機(jī)(yealink的T2系列話機(jī)),不到兩個(gè)小時(shí),一切OK了。
現(xiàn)在公司的電話系統(tǒng)已經(jīng)正常運(yùn)行兩個(gè)月了,也不見系統(tǒng)有卡住的問題,我特地問了下億群的技術(shù)支持,他們告訴我說這個(gè)問題他們已經(jīng)解決了,說這個(gè)問題 是asteirsk的bug,在解析域名的時(shí)候會(huì)卡住,他們用了主機(jī)池,在要解析的域名用一個(gè)獨(dú)立的線程解析,然后asterisk直接從池里面獲取IP 地址。不是很懂,反正卡住的問題再也沒有出現(xiàn)過了。
下面談?wù)勎沂褂眠@個(gè)設(shè)備的感受:
1,系統(tǒng)十分穩(wěn)定。這個(gè)得到包括老板在內(nèi)所有同事的認(rèn)可?,F(xiàn)在系統(tǒng)運(yùn)行兩個(gè)多月都很正常就是最好的證明;
2,嵌入式平臺,集成傳統(tǒng)電話接口,不用裝驅(qū)動(dòng),不用額外購買板卡;還支持GSM,方便布線;
3,功能強(qiáng)大: 基本功能就不說了,有興趣大家上他們網(wǎng)站看看。像SRTP, SIP(TCP,TLS)這些功能應(yīng)該說走在了國內(nèi)其他廠商的前面。雖然用的不多,但有這些功能讓我對他們的技術(shù)實(shí)力更加信任;
4,DDNS, VLAN, PPPoE,Qos,防火墻,這個(gè)沒得說,十分必要;等體現(xiàn)產(chǎn)品專業(yè)性;
5,基于asterisk,但是修復(fù)了不少asterisk的bug;也解決不少忙音檢測,callerid檢測的兼容性問題。經(jīng)過后來跟他們技術(shù) 支持的溝通中了解到,他們之前都是多國外的市場,做了很多國家的忙音,包括臺灣,日本,土耳其等國家的CID,忙音檢測的兼容性修改。
總之一個(gè)字:贊!
這是他們的網(wǎng)站: http://www.yeastar.cn/Products/MyPBX.asp
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 有內(nèi)部電話軟電話2003,2004。我使用asterCRM 定時(shí)撥號功能 被叫2003 ,分配給2004,制定撥號時(shí)間,到時(shí)間后 2003 會(huì)有振鈴 但來電顯示確實(shí)2003的來電,接聽電話直接自動(dòng)掛斷了
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> app通過網(wǎng)絡(luò)呼叫到電話,電話接聽后按*、#,app可以得到相應(yīng)的通知,這個(gè)該用什么sip服務(wù)器啊
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> Digium做的幾款A(yù)sterisk模擬語音卡評測Digium語音卡與眾不同 除了Digium,還有幾家做語音卡的,在北美就有加拿大的Sangoma,亞利桑那州的Rhino 等也在做 Asterisk 適用的模擬接口卡。 Digium 認(rèn)為自己提供的產(chǎn)品比其他公司的都好。后面會(huì)有證據(jù)來證明這個(gè)觀點(diǎn)。 1) Digium寫的驅(qū)動(dòng)。 簡單的測試就知道,其他公司無論是模擬模塊或是模擬線路的驅(qū)動(dòng)最初都是Digium 開發(fā)的。還有誰能比 原作者提供更好的支持呢? 2) Digium是Asterisk 的原作者 Sangoma 和Rhino 的員工不是被雇來開發(fā)Asterisk 的。相反地,他們只是讓他們的卡能用在Asterisk 上。Digium 保持至少一打人全職開發(fā)Asterisk 的內(nèi)核和應(yīng)用。Digium 比其他人更有能力為電話語音卡和通信 應(yīng)用提供端到端的支持。 3) Digium提供單口模擬模塊 Sangoma 和Rhino 只生產(chǎn)雙口模塊, Digium的4 口卡和8 口卡將支持單口模塊,提供更好的間隔尺寸。 何必購買超過需要的端口呢? 4) Digium提供模塊化的硬件回聲消除 Sangoma 和Rhino 提供的硬件回聲消除模塊需要用戶提前付款,不能升級。Digium 的硬件模塊可以隨 卡采購,也可以根據(jù)需要以后再購買。Digium 更靈活。 5) Digium板卡做的更好 Sangoma 和Rhino 指責(zé)Digium 在IRQ 中斷處理和CPU 占用率高方面技術(shù)缺陷,現(xiàn)在Digium 來揭開 真相。 IRQ中斷處理 為了測試各個(gè)供應(yīng)商的板卡在惡劣的實(shí)時(shí)環(huán)境下的表現(xiàn),Digium 搭建了一個(gè)測試環(huán)境來模擬當(dāng)板卡驅(qū)動(dòng)無 法正常提供中斷的情況下——中斷處理的結(jié)果。 為了模擬這個(gè)環(huán)境,Digium 寫了一個(gè)程序來在sysfs 文件系統(tǒng)中導(dǎo)出文件,這讓用戶可以指定CPU 暫停 中斷處理的時(shí)間(多少毫秒)。當(dāng)文件寫完后,中斷會(huì)立即停止一個(gè)指定的時(shí)間長度。 這樣惡劣的條件在正在運(yùn)行的系統(tǒng)里會(huì)伴隨著高負(fù)荷、其他設(shè)備比如以太網(wǎng)和RAID 控制器占用中斷周期 長等問題而一起出現(xiàn)。這個(gè)很具代表性。在實(shí)時(shí)的環(huán)境下看看呼叫傳輸?shù)腻e(cuò)誤情況。 測試環(huán)境: ? Asterisk 1.4.17 tarball ? Zaptel SVN 1.4 r41114 ? Dell Dimension 3100 ? Debian “Etch” 2.6.18.5-amd64 ? Empirix Hammer 測試配置如下: [attachment=405] 在這個(gè)測試中,Empirix Hammer 用來測試語音質(zhì)量。它發(fā)起一個(gè)SIP 呼叫到運(yùn)行了Asterisk 的電腦。 一個(gè)從FXS 環(huán)回到FXO 模塊的模擬語音卡插在這個(gè)電腦上。Asterisk 把這個(gè)呼叫通過模擬模塊路由回Asterisk 然后通過SIP 傳回Hammer。 Hammer 測量Perceptual Evaluaton of Speech Quality (PESQ),電話系統(tǒng)語音質(zhì)量的客觀評價(jià)指標(biāo)。 PESQ 值低于3.5 就是不能通過的。另外一項(xiàng)常用的語音質(zhì)量測量體系是Mean Opinion Score (MOS)。Digium 選擇PESQ 是因?yàn)镻ESQ 得分是客觀的,而MOS 值是主觀評分。 2 測試用卡包括: ? Digium TDM410 ? Digium TDM800 ? Digium AEX800 ? Sangoma A400, Wanpipe 3.2.5 Driver Package ? Rhino R8FXX, Rhino 2.2.4 Driver Package PESQ 得分的結(jié)果圖標(biāo)是通過中斷阻塞處理的時(shí)長得出的。 [attachment=406] Digium 的TDM410, TDM800 和AEX800 卡在中斷阻塞8ms 的情況下仍然可以維持語音質(zhì)量,對于任 何中斷長度,語音質(zhì)量都是可以接受的。 Sangoma 的A400 在中斷阻塞4ms 的情況下能夠維持語音質(zhì)量得分3.5 以上。超過4ms,語音質(zhì)量就 低于3.5,屬于不能接受。 Rhino 的R8FXX 只能在阻塞1ms 的情況下才能夠維持語音質(zhì)量得分3.5 以上。超過2ms,得分就低于 3.25,語音質(zhì)量不能接受了。 Digium跟競爭對手相比: ? Digium TDM410 平均PESQ 得分比Sangoma A400 高9.38%,比Rhino R8FXX 高18%。 ? Digium TDM800 平均PESQ 得分比Sangoma A400 高13.96%,比Rhino R8FXX 高22.61%。 ? Digium AEX800 平均PESQ 得分比Sangoma A400 高15.69%,比Rhino R8FXX 高24.79%。 這些結(jié)果說明如下一個(gè)事實(shí): Digium 模擬語音卡的中斷處理機(jī)制更優(yōu)越。 CPU利用率 Digium 實(shí)施了一個(gè)測試來檢測模擬卡的CPU 占用率。在這個(gè)測試中,連續(xù)不斷地從測試機(jī)器發(fā)起呼叫到 另外一臺空閑的機(jī)器,每個(gè)呼叫持續(xù)30 秒鐘,然后掛機(jī)。 CPU 利用率的圖表是從top 程序的CPU 空閑百分比數(shù)據(jù)獲取的,從一個(gè)5 分鐘的時(shí)間段來計(jì)算平均值。 測試環(huán)境 ? Asterisk 1.4.17 tarball ? Zaptel 1.4.8 tarball ? Dell Dimension 3100 ? Control Digium TDM844B ? Whitebox PC ? Debian “Etch” 2.6.18.5-amd64 [attachment=407] 這次測試?yán)昧薉ell Dimension 3100 插模擬語音卡來跑Asterisk,另外一臺白盒測試機(jī)器插的是 Digium TDM844B 卡,也跑得是Asterisk 軟件。 測試用卡包括: ? Digium TDM844E 帶硬件回聲消除,8 路并發(fā)呼叫 ? Digium AEX844E 帶硬件回聲消除,8 路并發(fā)呼叫 ? Sangoma A400, Wanpipe 3.2.3 驅(qū)動(dòng)包,帶硬件回聲消除,6 路并發(fā)呼叫 ? Rhino R8FXX, Rhino 2.2.4 驅(qū)動(dòng)包,帶硬件回聲消除,4 路并發(fā)呼叫 下圖是CPU 利用率百分比的結(jié)果圖片: Digium跟競爭對手相比: ? Rhino R8FXX 在4 個(gè)通道工作的情況下比Digium TDM800 在8 個(gè)通道的情況下占用的CPU 高了 70%,比Digium AEX800 在8 個(gè)通道工作的情況下占用的CPU 資源高出54%。 ? Sangoma 的A400 在6 個(gè)通道同時(shí)工作的情況下比比Digium TDM800 的8 個(gè)通道工作狀態(tài)占用的 CPU 高了30%,比Digium AEX800 在8 個(gè)通道工作的情況下占用的CPU 資源高出17%。 這些結(jié)果說明如下一個(gè)事實(shí): Digium 模擬語音卡可以處理更多的通道,占用更少的CPU 資源。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
中小企業(yè)需要大約5席(以后可以方便擴(kuò)展)電話客服,可以呼出,400號碼+Asterisk+?能實(shí)現(xiàn)么?
具體怎么實(shí)現(xiàn)?
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 最近遇到一個(gè)十分頭疼的問題,手機(jī)安裝sip電話 客戶端 后,當(dāng)用sip電話接通電話的過程中遇到普通電話來電,普通電話來電會(huì)照樣響鈴,這樣無法保障IP電話的正常使用,不知道各位有沒有遇到過這個(gè)問題,該如何處理?
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
如題,asterisk撥號方案中如何獲得外線呼入的被叫號碼?我要把它傳到AGI中使用。
外線呼入手機(jī)號撥打到asterisk系統(tǒng),手機(jī)號13××××××××跟外線通道dahdi/1都獲取到了,就差撥打的號碼,即DNID( Dialed Number Identifier ),CLI控制臺agi調(diào)試信息中看到的一直是unknown。
求高手指點(diǎn),查了一天資料了沒能搞定。。。
我asterisk版本 1.4,外線:普通電話線 pstn。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
前言: bigbluebutton是一個(gè)萬維網(wǎng)廣播站和會(huì)議系統(tǒng),他是基于Flash的視頻會(huì)議,后臺服務(wù)器使用Red5 Server。 本篇是參考installing from source英文版,根據(jù)自己的情況有點(diǎn)改動(dòng),系統(tǒng)是基于ubuntu之上。 如果想在ubuntu上快安裝bigbluebutton請參見英文文檔:http://code.google.com/p /bigbluebutton/wiki/InstallationUbuntu。 如果不想安裝bigbluebutton,只想測試bigbulebutton可以參見:http://code.google.com/p /bigbluebutton/wiki/BigBlueButtonVM。 關(guān)于更多bigbluebutton的查看:http://code.google.com/p/bigbluebutton
筆記開始:
1.檢查網(wǎng)絡(luò)
2.更新與升級
sudo apt-get update
sudo apt-get upgrade
3.安裝JAVA 6
sudo apt-get install openjdk-6-jre-headless
安裝了下列軟件包:
ca-certificates-java icedtea-6-jre-cacao java-common libaccess-bridge-java openjdk-6-jre-headless openjdk-6-jre-lib rhino tzdata-java
4.安裝MySQL
sudo apt-get install mysql-server
安裝了下列軟件包:
libdbd-mysql-perl libdbi-perl libhtml-template-perl libnet-daemon-perl libplrpc-perl mysql-client-5.0 mysql-server mysql-server-5.0 mysql-server-core-5.0
5.安裝Tomcat
sudo apt-get install tomcat6
安裝了下列軟件包:
gcj-4.3-base jsvc libcommons-collections-java libcommons-daemon-java libcommons-dbcp-java libcommons-pool-java libecj-java libecj-java-gcj libgcj-bc libgcj-common libgcj9-0 libgcj9-jar libservlet2.5-java libtomcat6-java tomcat6 tomcat6-common
測試一下:
http://:8080
6.安裝swftools
sudo apt-get install swftools
安裝了下列軟件包:
libt1-5 swftools
7.安裝Imagemagick
sudo apt-get install imagemagick
安裝了下列軟件包:
imagemagick imagemagick-doc
8.安裝Nginx
sudo apt-get install nginx
安裝了下列軟件包:
nginx
9.安裝ActiveMQ
cd /opt
sudo wget http://apache.mirror.rafal.ca/activemq/apache-activemq/5.2.0/apache-activemq-5.2.0-bin.tar.gz
sudo tar zxvf apache-activemq-5.2.0-bin.tar.gz
sudo mv apache-activemq-5.2.0-bin.tar.gz /usr/local/activemq
啟動(dòng)ActiveMQ
sudo /usr/local/activemq/bin/activemq
10.修改tomcat6帳戶
############################
tomcat6?106:113::/usr/share/tomcat6:/bin/bash
11.安裝red5
cd /opt
sudo wget http://build.xuggle.com/job/red5_jdk6_stable/131/artifact/workingcopy/red5-0.8.RC3-build-hudson-red5_jdk6_stable-131.tar.gz
sudo tar zxvf red5-0.8.RC3-build-hudson-red5_jdk6_stable-131.tar.gz
sudo mv red5-0.8.RC3-build-hudson-red5_jdk6_stable-131 /usr/local/red5-0.8
用戶tomcat用戶啟動(dòng)red5
sudo su -l tomcat6
./red5.sh(需要root權(quán)限)
注:英文照考文檔中是以上兩行,而我在實(shí)際中使用tomcat用戶啟動(dòng)red5 server是有很多[Error]提示。使用root啟動(dòng)就沒那些Error,即使用sudo ./red5.sh命令啟動(dòng)。
12.安裝oflaDemo
在瀏覽器的URL輸入網(wǎng)址:http://:5080/installer/
選擇”oflaDemo”,再點(diǎn)擊”Install”
安裝后在瀏覽器URL輸入網(wǎng)址:http://5080/demos/ofla_demo.html
編輯”rtmp://localhost/oflaDemo”并點(diǎn)擊”[connect]”
在左邊的[library]選擇一個(gè),即可以在[Video]中看到視頻。
13.安裝編譯(Asterisk)環(huán)境:
sudo apt-get install build-essential linux-headers-2.6.28-15-generic libssl-dev ncurses-dev libnewt-dev zlib1g-dev bison
額外安裝了下列軟件包:
dpkg-dev g++ g++-4.3 libncurses5-dev libpng12-dev libslang2-dev libstdc++6-4.3-dev m4 patch
14.安裝Dahdi(原zaptel)
cd /usr/local/src
sudo wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-2.2.0.2+2.2.0.tar.gz
sudo tar zxvf dahdi-linux-complete-2.2.0.2+2.2.0.tar.gz
cd dahdi-linux-complete-2.2.0.2+2.2.0
sudo make all(需要root權(quán)限)
sudo make install
make config
注:如果服務(wù)器沒有安裝板卡,不需要安裝Dahdi,他只是digium板卡的驅(qū)動(dòng)
15.安裝.Asterisk
cd /usr/local/src
sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.4.25.tar.gz
sudo tar zxvf asterisk-1.4.25.tar.gz
cd asterisk-1.4.25
sudo ./configure
sudo make all
sudo make install
sudo make config
16.配置Asterisk
添加一個(gè)extensions
sudo vi /etc/asterisk/extensions.conf
; BigBlueButton: Setup sample conference
[bigbluebutton]
;
; Create an extension, 600, for evaluating echo latency.
;
exten => 600,1,Answer ; Do the echo test
exten => 600,n,Playback(demo-echotest) ; Let them know what’s going on
exten => 600,n,Echo ; Do the echo test
exten => 600,n,Playback(demo-echodone) ; Let them know it’s over
exten => 600,n,Hangup()
創(chuàng)建SIP帳號
sudo vi /etc/asterisk/sip.conf
; BigBlueButton: Setup sample user to connect over VoIP
[user1]
type=friend
username=user1
insecure=very
secret=secret
qualify=yes
nat=yes
host=dynamic
canreinvite=no
context=bigbluebutton
allow=all
[user2]
type=friend
username=user2
insecure=very
secret=secret
qualify=yes
nat=yes
host=dynamic
canreinvite=no
context=bigbluebutton
allow=all
[user3]
type=friend
username=user3
insecure=very
secret=secret
qualify=yes
nat=yes
host=dynamic
canreinvite=no
context=bigbluebutton
allow=all
[user4]
type=friend
username=user4
insecure=very
secret=secret
qualify=yes
nat=yes
host=dynamic
canreinvite=no
context=bigbluebutton
allow=all
創(chuàng)建AMI帳號
sudo vi /etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
; BigBlueButton: Enable Red5 to connect
[bbb]
secret = secret
permit = 0.0.0.0/0.0.0.0
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
17.配置nginx
sudo vi /etc/nginx/sites-available/bigbluebutton
修改server_name參數(shù)為自己的IP
server {
listen 80;
server_name demo
#server_name 192.168.2.125;
access_log /var/log/nginx/bigbluebutton.access.log;
location ~ (/open/|/close/|/idle/|/send/) {
proxy_pass http://127.0.0.1:8088;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
}
location /deskshare {
proxy_pass http://127.0.0.1:5080;
proxy_redirect default;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
include fastcgi_params;
}
location /bigbluebutton {
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
include fastcgi_params;
}
location / {
root /var/www/bigbluebutton-default;
index index.html index.htm;
}
location /client {
root /var/www/bigbluebutton;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
}
sudo ln -s /etc/nginx/sites-available/bigbluebutton /etc/nginx/sites-enabled/bigbluebutton
18.下載bigbluebutton
sudo mkdir -p /home/user/temp
cd /home/user/temp
sudo wget http://www.bigbluebutton.org/hudson/job/BBB-Trunk-Apps/ws/dist/bigbluebutton-apps-0.5.tar.gz
sudo wget http://www.bigbluebutton.org/hudson/job/BBB-Trunk-Apps-Deskshare/ws/dist/webapps/deskshare.tar.gz
sudo wget http://www.bigbluebutton.org/hudson/job/BBB-Trunk-Client/ws/client.tar.gz
sudo wget http://www.bigbluebutton.org/hudson/job/BBB-Trunk-Web/ws/bigbluebutton-0.1.war
sudo wget http://www.bigbluebutton.org/hudson/job/BBB-Trunk-Config/ws/web//*zip*/web.zip
19.禁用Tomcat6的Security設(shè)置
sudo vi /etc/default/tomcat6
把”#TOMCAT6_SECURITY=yes”換成”TOMCAT6_SECURITY=no”
20.安裝數(shù)據(jù)庫
mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 5.0.75-0ubuntu10.2 (Ubuntu)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> create database bigbluebutton_dev;
Query OK, 1 row affected (0.08 sec)
mysql> grant all on bigbluebutton_dev.* to ‘bbb’@'localhost’ identified by ’secret’;
Query OK, 0 rows affected (0.05 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
21.安裝BigBlueButton web
cd /var/lib/tomcat6/webapps
sudo cp /home/user/temp/bigbluebutton-0.1.war ./bigbluebutton.war
22.確認(rèn)DF2SWF,CONVERT和GS(GhostScript)應(yīng)用
which pdf2swf
which convert
which gs
23.編輯bbb-web屬性(properties)
sudo vi /var/lib/tomcat6/webapps/bigbluebutton/WEB-INF/classes/bigbluebutton.properties
修改下列幾個(gè):
-swfToolsDir參數(shù)(pdf2swf目錄位置)”swfToolsDir=/usr/bin”
-imageMagickDir參數(shù)(convet目錄位置)”imageMagickDir=/usr/bin”
-ghostScriptExec參數(shù)(指向gs應(yīng)用位置)”ghostScriptExec=/usr/bin/gs”
-bigbluebutton.web.serverURL參數(shù)替換成自己的IP地 址”bigbluebutton.web.serverURL=http://192.168.2.125″
重啟tomcat6
24.生成數(shù)據(jù)庫
在瀏覽器的URL輸入:http://:8080/bigbluebutton就會(huì)自動(dòng)生成bigbluebutton_dev數(shù)據(jù)庫的所有表
測試一下:
> mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 56
Server version: 5.0.75-0ubuntu10.2 (Ubuntu)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> use bigbluebutton_dev;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+—————————–+
| Tables_in_bigbluebutton_dev |
+—————————–+
| account |
| account_conference |
| account_user |
| conference |
| permission |
| role |
| role_permission_rel |
| scheduled_session |
| user |
| user_permission_rel |
| user_role_rel |
| voice_conference_bridge |
+—————————–+
12 rows in set (0.00 sec)
mysql>
25.創(chuàng)建Presentation上傳目錄
sudo mkdir /var/bigblue
sudo chown tomcat6:adm-R /var/bigbluebutton
sudo chmod 777 -R /var/bigbluebutton
26.安裝bbb-apps
cd /usr/local/red5-0.8/webapps
sudo cp /home/user/temp/bigbluebutton-apps-0.5.tar.gz ./
sudo tar zxvf bigbluebutton-apps-0.5.tar.gz
sudo mv webapps/bigbluebutton/ ./
sudo rm -fr bigbluebutton-apps-0.5.tar.gz webapps/
27.編輯BigBlueButton Apps properties
sudo vi /usr/local/red5-0.8/webapps/bigbluebutton/WEB-INF/bigbluebutton.properties
#
# Location for recordings
recordingsDirectory=/var/bigbluebutton
# These properties are for Asterisk Management Interface (AMI)
ami.host=127.0.0.1
ami.port=5038
ami.username=bbb
ami.password=secret
28.反注釋/usr/local/red5-0.8/conf/red5-core.xml中的RTMPT部分
29.安裝xuggler
sudo cd /usr/local
sudo wget http://com.xuggle.s3.amazonaws.com/xuggler/xuggler-3.1.FINAL/xuggle-xuggler.3.1.818-i686-pc-linux-gnu.sh
sudo chmod a+x xuggle-xuggler.3.1.818-i686-pc-linux-gnu.sh
sudo ./xuggle-xuggler.3.1.818-i686-pc-linux-gnu.sh
30.設(shè)置xuggler環(huán)境變量
sudo vi /etc/profile
export XUGGLE_HOME=/usr/local/xuggler
export LD_LIBRARY_PATH=$XUGGLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$XUGGLE_HOME/bin:$PATH
31.安裝Desk共享Apps
cd /usr/local/red5-0.8/webapps
sudo cp /home/user/temp/deskshare.tar.gz ./
sudo tar zxvf deskshare.tar.gz
sudo rm -fr deskshare.tar.gz
32.安裝BigBlueButton客戶端
cd /var/www
sudo mkdir bigbluebutton
cd bigbluebutton
sudo cp /home/user/temp/client.tar.gz ./
sudo tar zxvf client.tar.gz
sudo rm -fr client.tar.gz
33.修改BBB客戶端配置
sudo vi /var/www/bigbluebutton/client/conf/config.xml
-改變uri成你的IP address
-改變host=”conf/join-mock.xml”為host=”http:///bigbluebutton/conference-session/enter”
34.安裝bbb默認(rèn)主頁
cd /var/www
sudo cp /home/user/temp/web.zip ./
sudo unzip -dc web.zip
sudo mv c/web ./bigbluebutton-default
sudo rm -rf c
安裝結(jié)束,重啟ActiveMQ、Red5 Server、Tomcat、Asterisk服務(wù)
測試:
在瀏覽器的url輸入http;//就能開始使用bigbluebutton
參考:
http://code.google.com/p/bigbluebutton/wiki/InstallingBigBlueButton
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
openfire+spark可以實(shí)現(xiàn)即時(shí)消息,再加上SIP插件和asterisk-IM插件,通過asterisk可以打電話
這里的openfire是充當(dāng)了sip服務(wù)器的功能嗎?這里的openfire實(shí)際上在SIP電話的業(yè)務(wù)上是相當(dāng)于opensips的功能?
openfire和opensips是否可以結(jié)合起來使用?
在網(wǎng)上查了資料,opensips相當(dāng)于是SIP代理,類似于路由器,asterisk相當(dāng)于PC,用戶打電話。
是否可以這樣,spark+SIP插件---->openfire+asterisk-IM插件------->asterisk------>opensips---->IAD------>普通電話,這樣可以實(shí)現(xiàn)spark和電話通話?
請知道的朋友回答一下,謝謝。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
我是一個(gè)新手,最近使用bigbluebutton0.71軟件來搭建一個(gè)視頻會(huì)議系統(tǒng),基本的功能如:音視頻通信,白板,即時(shí)通信,桌面共享都很正常。
但是,我苦惱的是,如何使用普通的sip軟電話(如x-lite)參與bigbuebutton視頻會(huì)議系統(tǒng)的voice conferece?我在這里是使用Asterisk來實(shí)現(xiàn)語音功能,但是如何對他設(shè)置?如何使用sip軟電話終端進(jìn)行撥號?號碼如何設(shè)置?我沒有一點(diǎn)頭緒,期望各位前輩、達(dá)人給一些建議,感激不盡...
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> chan_ooh323.c:85: error: storage size of `ooh323_rtp' isn't known make[1]: *** [chan_ooh323.o] Error 1 make[1]: Leaving directory `/usr/src/asterisk-addons-1.6.2.3/channels' make: *** [channels] Error 2
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
Servlet 2.3
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
" http://java.sun.com/dtd/web-app_2_3.dtd ">
...
Servlet 2.4
xmlns=" http://java.sun.com/xml/ns/j2ee "
xmlns:web=" http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd "
xsi:schemaLocation=" http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd "
version="2.4">
...
Servlet 2.5
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd "
version="2.5">
...
轉(zhuǎn)
--------------------------------------------------------
以上是常用web.xml的配置,但始終查不到was支持哪些版本,HELP
war包,至今放不到was7上的
我的web.xml配置版本是2.4的
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
代碼如下
```
package com.nineplus.cyanbird.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.nineplus.cyanbird.base.constants.AlipayContants;
import com.nineplus.cyanbird.base.constants.OrderStatusConstants;
import com.nineplus.cyanbird.base.dao.FunOrderDao;
import com.nineplus.cyanbird.base.domain.view.FunOrder;
import com.nineplus.cyanbird.base.service.FunOrderService;
import com.nineplus.model.InvokeResult;
public class AlipayServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
private FunOrderDao funOrderDao;
private FunOrderService funOrderService;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
alipayNortify(request,response);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
public void alipayNortify(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(params, AlipayContants.alipay_public_key, AlipayContants.charset, AlipayContants.sign_type);
} catch (AlipayApiException e) {
e.printStackTrace();
}
if(signVerified) {
String seller_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");
if(!seller_id.equals(AlipayContants.app_id)){
System.out.println("fail");
}
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
Float totalCost = new Float(total_amount);
FunOrder f = new FunOrder();
f.setId(out_trade_no);
f.setTotalCost(totalCost);
FunOrder exitF = funOrderDao.get(f);
if(exitF==null){
System.out.println("fail");
}
if(trade_status.equals("TRADE_FINISHED")){
if(!exitF.getStatus().equals(OrderStatusConstants.FINISH)){
exitF.setStatus(OrderStatusConstants.FINISH);
funOrderDao.update(exitF);
InvokeResult r = funOrderService.commitFunOrderSuccess(exitF);
if(r.getStatus()!=1){
System.out.println("fail");
}
}
}else if (trade_status.equals("TRADE_SUCCESS")){
if(!exitF.getStatus().equals(OrderStatusConstants.FINISH)){
exitF.setStatus(OrderStatusConstants.FINISH);
funOrderDao.update(exitF);
InvokeResult r = funOrderService.commitFunOrderSuccess(exitF);
if(r.getStatus()!=1){
System.out.println("fail");
}
}
}
System.out.println("success");
}else {//驗(yàn)證失敗
System.out.println("fail");
}
}
}
web中配置
AlipayServlet
com.nineplus.cyanbird.servlet.AlipayServlet
AlipayServlet
/alipayServlet
WeChatServlet
com.nineplus.cyanbird.servlet.WeChatServlet
WeChatServlet
/weChatServlet
```
瀏覽器輸入:http://localhost:8080/aaa(項(xiàng)目名)/AlipayServlet/alipayServlet
顯示如下
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
問題背景:
Servlet3.1新特性——非阻塞式IO,ServletInputStream抽象類多了幾個(gè)方法isFinished()、isReady()、setReadListener(ReadListener listener)。這些在之前的Servlet3.0里是沒有的。
Tomcat7.x是Servlet3.0,Tomcat8.x是Servlet3.1。
之前是基于Tomcat7.x開發(fā)的程序,有個(gè)功能是做了個(gè)Request包裝類,過濾ajax提交內(nèi)容。里面把Request的getInputStream()方法重新實(shí)現(xiàn)。
@Override
public ServletInputStream getInputStream() throws IOException {
if (bais == null) {
bais = new ByteArrayInputStream(body);
} else {
bais.reset();
}
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
};
}
由于在Tomcat7.x環(huán)境下實(shí)現(xiàn)的,所以ServletInputStream沒有上面說的那幾個(gè)方法。
工程編譯打包好后發(fā)布到服務(wù)器是Tomcat8.x上,跑了許多天,居然沒有報(bào)錯(cuò)。為什么?
大神們,我的問題就是,像這種情況,有沒有隱患?或者Servlet3.1是否向下兼容Servlet3.0?我怎么也想不明白這樣的兼容是怎么做的,抽象類都改了,實(shí)現(xiàn)類不改居然不報(bào)錯(cuò)。
而且更疑惑的是,我用的Spring4.3.5,看了里面ContentCachingRequestWrapper類用的ContentCachingInputStream居然也是沒有實(shí)現(xiàn)Servlet3.1新增的那幾個(gè)方法。還有DelegatingServletInputStream也是一樣沒實(shí)現(xiàn)。由此應(yīng)該確定Spring4.3也是基于Servlet3.0的,沒有實(shí)現(xiàn)Servlet3.1。
大神們,第二個(gè)問題,如標(biāo)題,你們用Servlet3.1了嗎?用了的話來討論討論,上面那幾個(gè)方法有沒有參考實(shí)現(xiàn),給參考參考。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
用Eclipse Mar2版本和tomcat7:
在用Eclipse自動(dòng)生成Servlet類之后會(huì)生成一個(gè)注解,但是我還在web.xml文件中又配制了一遍,那么為什么在啟動(dòng)tomcat的時(shí)候會(huì)報(bào):Server Tomcat v7.0 Server at localhost failed to start.
錯(cuò)誤呢?
感覺得,以前也是這樣子做的,沒有報(bào)錯(cuò)呀
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
下載 Servlet 3.0 規(guī)范
Java servlets 是一項(xiàng)被普遍接受的技術(shù),用于構(gòu)建基于 web 應(yīng)用程序的動(dòng)態(tài)內(nèi)容;Servlet 3.0 規(guī)范早期草案版本的發(fā)行讓該技術(shù)在特性和應(yīng)用程序接口(Application Program Interface,API)方面得到了極大增強(qiáng)。Java Specification Request(JSR)已經(jīng)以 JSR 315 的形式得到了批準(zhǔn),并計(jì)劃成為 Java Enterprise Edition 6(JSR 316)或更高版本的組成部分。與之前僅僅是維護(hù)發(fā)行版(maintenance releases)的一些版本規(guī)范不同,Servlet 3.0 規(guī)范隨帶了許多 web 開發(fā)新時(shí)代所需的最令人興奮的特性。在本文中,我們將研究新版 Java servlets 中引入的主要特性。值得注意的是,本規(guī)范仍處于草案版本階段,因此在本文中所討論的技術(shù)細(xì)節(jié)可能會(huì)發(fā)生變化。
新規(guī)范主要交付了以下新特性:
開發(fā)的簡易性
可插拔性和可擴(kuò)展性
異步支持
安全性增強(qiáng)
其他雜項(xiàng)變化
很明顯,與其他技術(shù)相比,servlets 在 Java Enterprise Edition 家族中有著更廣泛的應(yīng)用。Servlets 保留了其簡潔性和能夠處理 HTTP 請求并向 web 客戶機(jī)傳回響應(yīng)的優(yōu)點(diǎn)。Servlets 可以用于實(shí)現(xiàn)簡單和小型應(yīng)用程序的業(yè)務(wù)邏輯。在 web 框架中,servlets 作為所有傳入請求的入口點(diǎn)(即 controller servlet);因此,所有流行框架都是在原始的 servlets 上建立的。Servlet 3.0 中的新增特性旨簡化 servlet 應(yīng)用程序的開發(fā),并讓 servlet 開發(fā)人員和框架開發(fā)人員從中受益。在以下章節(jié)中,我們將詳細(xì)介紹每個(gè)新增特性,并討論如何使用它們來開發(fā)更優(yōu)秀的應(yīng)用程序。
開發(fā)的簡易性
開發(fā)的簡易性是任何技術(shù)成功的關(guān)鍵因素。Servlet 3.0 API 通過使用 JSR 175 注釋 集中解決開發(fā)簡易性問題,允許開發(fā)人員采用聲明式的編程方式。這意味著您可以通過使用像 @Servlet 或者 @ServletFilter 這樣的適當(dāng)注釋對類進(jìn)行注釋來快速開發(fā)一個(gè) servlet 或者過濾器類。注釋不僅使 servlet、過濾器和偵聽器類的編碼更容易,而且,即使應(yīng)用程序存檔可能有 servlet、過濾器或者上下文偵聽器類也可以選擇用于 web 應(yīng)用程序的開發(fā)部署描述符。Web 容器負(fù)責(zé)處理各種注釋,其位置在 WEB-INF/classes 目錄下的各個(gè)類中、WEB-INF/lib 目錄下的 .jar 文件中、或者應(yīng)用程序類路徑中任何可以找到的類中。
注釋與部署描述符
值得注意的是,部署描述符優(yōu)先于注釋。換句話說,部署描述符覆蓋通過注釋機(jī)制所規(guī)定的配置信息。Web 部署描述符的 3.0 版本在 web-app 元素上包含一種名為 metadata-complete 的新屬性。該屬性定義了 web 描述符是否完整,或者 web 應(yīng)用程序的類文件是否針對指定部署信息的注釋而進(jìn)行檢查。如果該屬性被設(shè)置為 true,則部署工具必須忽略類文件中所存在的任何 servlet 注釋,并只使用描述符中所提及的配置細(xì)節(jié)。否則,如果沒有指定該值或者該值被設(shè)置為 false,容器必須針對注釋而掃描應(yīng)用程序的所有類文件。這個(gè)屬性提供了在應(yīng)用程序啟動(dòng)階段啟用或者禁用注釋掃描以及對注釋的處理。
在 Servlet 3.0 中所引入的所有注釋都可以在 javax.servlet.http.annotation 和 javax.servlet.http.annotation.jaxrs 軟件包中找到。以下章節(jié)闡述 Servlet 3.0 中注釋的完整集合:
@Servlet:javax.servlet.http.annotation.Servlet 是一個(gè)類級別的注釋,確認(rèn)經(jīng)過注釋的類為一個(gè) servlet 并保存關(guān)于所聲明的 servlet 的元數(shù)據(jù)。urlMappings 屬性是指定 URL 模式(調(diào)用該 servlet)的 @Servlet 的強(qiáng)制屬性。當(dāng)接收到了一個(gè)請求時(shí),容器將請求中的 URL 與 servlet 的 urlMappings 進(jìn)行匹配,且如果 URL 模式匹配,則調(diào)用相應(yīng)的 servlet 以響應(yīng)該項(xiàng)請求。該注釋的所有其他屬性都是可選的,并帶有合理的默認(rèn)值。Servlet 類中必須有一種使用像 GET、PUT、POST、HEAD 或者 DELETE 這樣的 HttpMethod 注釋進(jìn)行注釋的方法。這些方法應(yīng)將 HttpServletRequest 和 HttpServletResponse 作為方法參數(shù)。與以前的版本相反,servlets 3.0 的版本可以作為簡單傳統(tǒng) Java 對象(Plain Old Java Objects,POJOs)而實(shí)現(xiàn);也就是 servlets 不必再擴(kuò)展像 HTTPServlet 或者 GenericServlet 這樣的基礎(chǔ) servlet 實(shí)現(xiàn)類。
為了進(jìn)行比較,在此給出了使用傳統(tǒng) Servlet 2.5 API 編寫的 Java servlet 代碼片段,如下所示。在 Servlet 2.5 中,只要在部署描述符中配置了 servlet 的詳細(xì)信息,web 容器就將初始化 servlet。
public class MyServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) { .... } } |
---|
Deployment descriptor (web.xml)
MyServlet samples.MyServlet |
---|
MyServlet
/MyApp
...
這里給出的是使用 Servlet 3.0 API 編寫的較為簡化的版本。當(dāng) MyServlet 使用 @Servlet 注釋而被注釋為一個(gè) servlet 時(shí),則在 web 容器的啟動(dòng)期間對其初始化。注意,在這種情況下部署描述符是可選的。
@Servlet(urlMappings={"/MyApp"}) public class MyServlet { @GET public void handleGet(HttpServletRequest req, HttpServletResponse res) { .... } } Deployment descriptor (web.xml) |
---|
optional
@ServletFilter 和 @FilterMapping:您可以使用 javax.servlet.http.annotation.ServletFilter 注釋來注釋過濾器類,從而輕松創(chuàng)建一個(gè) servlet 過濾器。該注釋封裝正被聲明的過濾器的有關(guān)元數(shù)據(jù)。在過濾器類上具有 @FilterMapping 注釋也是強(qiáng)制性的。@FilterMapping 注釋定義用于過濾器的 URL 模式。@ServletFilter 的所有其他屬性都是可選的,并帶有合理的默認(rèn)值。V3.0 過濾器類現(xiàn)在類似 POJO 類,并且沒有用于這些類所需的 Filter 接口或者非參數(shù)公用構(gòu)造器。以下給出了使用 Servlet v2.5 API 的過濾器類的代碼片段:
public class MyFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { ...... } } |
---|
Deployment descriptor (web.xml)
My Filter
samples.MyFilter
My Filter
/foo
...
使用 Servlet 3.0 編寫的一個(gè)示例過濾器類如下所示。因?yàn)樵擃愂褂?ServletFilter 注釋,所以容器將 MyFilter 標(biāo)記為一個(gè)過濾器類。MyFilter 截取所有收到的請求,其中該請求的 URL 匹配模式 /foo。Servlet 3.0 為過濾器配置提供了可選的部署描述符。
@ServletFilter @FilterMapping("/foo") public class MyFilter { public void doFilter(HttpServletRequest req, HttpServletResponse res) { ..... } } |
---|
Deployment descriptor (web.xml)
optional
@InitParam:該注釋可以用來定義必須傳遞給 servlet 或者過濾器類的任意初始化參數(shù)。它是 @Servlet 和 @ServletFilter 注釋的一個(gè)屬性。以下代碼示例解釋了如何將具有 english 值、稱作 lang 的初始化參數(shù)傳遞給一個(gè) servlet 類。
@Servlet(urlMappings={"/MyApp"}, initParams ={@InitParam(name="lang", value="english")}) public class MyServlet { @GET public void handleGet(HttpServletRequest req, HttpServletResponse res) { .... } } |
---|
@ServletContextListener:javax.servlet.http.annotation.ServletContextListener 注釋將該類聲明為一個(gè) servlet 上下文偵聽器。當(dāng) web 容器創(chuàng)建或者銷毀 ServletContext 時(shí),該上下文偵聽器接收注釋。上下文偵聽器是一個(gè) POJO 類,且不必實(shí)現(xiàn) ServletContextListener 接口。使用 Servlet 2.5 API 編寫的偵聽器類如下所示。當(dāng)且僅當(dāng)您在部署描述符中配置了該偵聽器類,容器才識別它。
public class MyListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { |
---|
}
.....
}
Deployment Descriptor (web.xml)
samples.MyListener
....
使用 Servlet 3.0 API 編寫的一個(gè)得到極大簡化的偵聽器類,如下所示。
@ServletContextListener
public class MyListener {
public void contextInitialized (ServletContextEvent sce) {
}
.....
}
Deployment Descriptor (web.xml)
optional
如今,像 Struts、JSF 和 Springweb 這樣的 web 框架已經(jīng)被普遍接受,并已經(jīng)確立成為構(gòu)建 web 應(yīng)用程序的技術(shù)。將這些框架集成為一個(gè) web 應(yīng)用程序并不是那么容易,因?yàn)檫@一過程涉及將不同的片段同化在一起,之后編輯一個(gè)描述如何將所有這些片段配合在一起的單獨(dú)描述符文件。絕大多數(shù)框架強(qiáng)制您 在應(yīng)用程序的部署描述符文件中配置像 servlet 類(通常為 控制器 Servlet)、過濾器類或者偵聽器類這樣的框架細(xì)節(jié)。這種必備配置的主要原因是當(dāng)今的 web 應(yīng)用程序只支持一個(gè)單獨(dú)的整體部署描述符,其中定義了所有的部署信息。當(dāng)應(yīng)用程序的大小增加時(shí),外部框架的依賴關(guān)系可能也增加,從而生成復(fù)雜的部署描述符 文件。正如您可能知道的,復(fù)雜描述的維護(hù)始終存在爭議。
為了解決這些問題,Servlet 3.0 最為顯著的概念之一是 web 片段 或者 模塊 web.xml 的思想。Web 片段是將 web 應(yīng)用程序邏輯分區(qū)為 servlet、servlet-mapping、servlet-filter、filter-mapping、servlet-listener 之類的元素及其子元素。框架開發(fā)人員可以利用該功能以定義存在于框架內(nèi)自己的 web 片段,開發(fā)人員可以在不修改現(xiàn)有的部署描述符的情況下僅僅通過將庫文件包含到應(yīng)用程序的類路徑中來插入越來越多的框架。簡言之,該功能旨在當(dāng)用框架或者庫 進(jìn)行工作時(shí)進(jìn)行零配置。
對該部署描述符已經(jīng)進(jìn)行了更改以包含保存 web 片段細(xì)節(jié)的
這一新元素。如果該片段被打包為一個(gè) .jar 文件且以部署描述符的形式具備元數(shù)據(jù)信息,則 web.xml 文件必須包含在 .jar 文件的 META-INF 目錄下。在部署時(shí),器掃描應(yīng)用程序的類路徑,查找所有 web 片段并加以處理。前面討論過的 metadata-complete 標(biāo)志在應(yīng)用程序啟動(dòng)期間控制 web 片段的掃描。以下顯示了一個(gè)示例 web 片段:
myservlet samples.MyServlet samples.MyListener |
---|
為了提供增強(qiáng)的可插拔性,Servlet 3.0 借助添加到 ServletContext 的 API 為增加 servlets 和過濾器類的編程提供了非常需要的支持。這些新的 API 使您能通過編程來聲明 servlets、過濾器類及其 URL 映射。這些類在應(yīng)用程序啟動(dòng)或者運(yùn)行期間進(jìn)行初始化。最重要的是,您只能通過 ServletContext 的 contextInitialized 方調(diào)用這些 API。有關(guān)這些 API 的更多信息,請參閱 Servlet 3.0 API 文檔。通過編程添加 servlet 和過濾器類的代碼示例如下所示:
@ServletContextListener public class MyListener { public void contextInitialized (ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); |
---|
//Declare servlet and servlet mapping
sc.addServlet("myServlet", "Sample servlet", "samples.MyServlet", null, -1);
sc.addServletMapping("myServlet", new String [] {"/urlpattern/*"});
//Declare filter and filter mapping
sc.addFilter("myFilter", "Sample Filter", " samples.MyFilter", null);
sc.addFilterMapping("myFilter", new String[] {"/urlpattern/*"}, "myServlet",
DispatcherType.REQUEST, false);
}
}
異步支持
大家應(yīng)該都遇到過 servlets 運(yùn)行緩慢的問題,特別是 servlets 必須等待來自 web 服務(wù)、JDBC 連接、JMS 消息等的響應(yīng)。在當(dāng)前情況下,servlet 在生成響應(yīng)前需要等待進(jìn)程完成,這會(huì)導(dǎo)致低效率阻塞操作消耗容器的線程或者其他有限的資源。在采用 JDBC 連接時(shí)的另一個(gè)不利影響是,數(shù)據(jù)庫可能存在許多等待訪問的阻塞線程。這種情況最終將導(dǎo)致整個(gè) web 容器的線程不足和服務(wù) 質(zhì)量下降。
為了克服上述缺點(diǎn),Servlet 3.0 添加了對掛起和恢復(fù)請求處理的支持,使 servlet 以異步、非阻塞的方式響應(yīng)請求(這就是編程的 Comet 樣式)。當(dāng)一項(xiàng)請求被掛起時(shí),處理請求的線程將在不生成任何響應(yīng)的情況下返回給容器并準(zhǔn)備執(zhí)行其他任務(wù)。處理請求的 resume 方法恢復(fù)請求處理。只要當(dāng)所請求的資源可用時(shí),處理事件的線程才恢復(fù)被掛起的請并進(jìn)行處理以生成響應(yīng)。以下列舉的是異步 servlets 的一些功能:
即使數(shù)據(jù)到達(dá)緩慢(非阻塞輸入),也能在沒有阻塞事件的情況下從客戶機(jī)接收數(shù)據(jù)。
即使客戶機(jī)或者網(wǎng)絡(luò)運(yùn)行緩慢(非阻塞輸出),也能在不發(fā)生阻塞的情況下向客戶機(jī)發(fā)送數(shù)據(jù)。
能處理被延遲的請求。如果在響應(yīng)請求前必須獲得遠(yuǎn)程/緩慢的資源,或者如果需要抑制訪問特定的資源以防止過多的同步訪問,對被延遲事件的處理是 非常有用的。
能處理被延遲的響應(yīng)關(guān)閉;也就是響應(yīng)將保持打開以允許在發(fā)生異步事件時(shí)發(fā)送其他數(shù)據(jù)。
能通知阻塞或者非阻塞事件。
將新的 API 添加到 ServletRequest 和 ServletResponse,用于掛起、恢復(fù)和查詢請求的狀況、啟用禁用和查詢響應(yīng)的狀況。開發(fā)人員可以分別通過 requestSuspended(), requestResumed() 和 requestCompleted() 方法使用請求的 resume、suspend 和 complete 方法通知事件。有關(guān)這些方法的詳細(xì)信息請參閱 Servlet 3.0 API。涉及使用異步 servlets 從遠(yuǎn)程 web 服務(wù)獲取數(shù)據(jù)的事件順序在圖 1 中進(jìn)行了圖解說明。
圖 1. 使用異步 servlet 處理請求
安全性
在 3.0 規(guī)范的早期草案中沒有考慮安全性問題,因?yàn)閷<覉F(tuán)仍未就此問題達(dá)成一致。不過,方案建議提供通過編程實(shí)現(xiàn)登錄和注銷功能。 HTTPServletRequest 中添加的新 API 可以啟用這項(xiàng)功能。HTTPServletRequest 的 login 方法使應(yīng)用程序或者框架強(qiáng)制進(jìn)行以容器為中介的驗(yàn)證。HTTPServletRequest 和 HTTPSession 的 logout 方法允許應(yīng)用程序重置請求的驗(yàn)證狀態(tài)。
其他雜項(xiàng)變化
下面列舉了一些為簡化數(shù)據(jù)檢索和簡化應(yīng)用程序開發(fā)而進(jìn)行的功能增強(qiáng)。
HttpOnly Cookie:Servlet 3.0 規(guī)范允許將 cookie 標(biāo)記為 HttpOnly cookie。由于向客戶端腳本代碼公開了 HttpOnly cookie,因而防止了某些種類的跨站點(diǎn)腳本攻擊。 大多數(shù)現(xiàn)代瀏覽器支持該項(xiàng)功能。以下列舉了添加到 Cookie 類中以支持 HTTPOnly cookie 的方法:
void setHttpOnly(boolean isHttpOnly) boolean isHttpOnly() |
---|
API 的變化: 將以下新增方法添加到 ServletRequest 中,以便輕松獲得與請求對象相關(guān)的 ServletResponse 和 ServletContext 實(shí)例。
ServletResponse getServletResponse() ServletContext getServletContext() |
---|
路線圖
3.0 規(guī)范的早期草案于 2008 年 6 月完成了審查。由于 Servlet 3.0 的目標(biāo)是用于 Java EE 6 平臺或者更高版本,因此該規(guī)范推薦的最終發(fā)行版也與 Java EE 6 的發(fā)行版匹配。但是,規(guī)范的早期測試版本將通過 GlassFish 來提供,后者是 Java EE 的參考實(shí)現(xiàn)。預(yù)計(jì) Servlet 3.0 的參考實(shí)現(xiàn)將被整合到 GlassFish 的版本 3 中。
JSR 草案在審查過程中確定了一些變化,正在編制的新方案將處理來自社區(qū)的建議和反饋意見。新方案中的主要變化如下:
@Servlet 被重新命名為 @WebServlet,而 @ServletContextListener 被重新命名為 @WebServletContextListener.
新方案建議 @WebServlet 必須擴(kuò)展 HTTPServlet 類。因此,如前所述,servlet 類可以不是 POJO 類。
類似地,@ServletFilter 類和 @WebServletContextListener 類需要分別實(shí)現(xiàn) Filter 和 ServletContextListener 接口。
為啟用和禁用 Servlet 提供選項(xiàng)。
要了解更多詳細(xì)信息,請參見在本文 參考資料 章節(jié)中提供的 更新方案。還需注意,這些新增特性會(huì)因本方案的最終批準(zhǔn)而發(fā)生變更。
結(jié)束語
在本文中,我們討論了在 Servlet 3.0 的早期草案規(guī)范中提出的激動(dòng)人心的特性。該規(guī)范已經(jīng)開始在社區(qū)引起強(qiáng)烈反響。通過注釋機(jī)制而實(shí)現(xiàn)的開發(fā)簡易性、零配置使用框架和庫、異步 servlets、可插拔性、安全性以及更多新增功能都是 Java Servlets 期待已久的特性。這說明,一些已經(jīng)閱讀了該規(guī)范的人表達(dá)了對注釋過度使用、在掃描 web 片段時(shí)的安全威脅等問題的關(guān)注。但是,毫無疑問,Java Servlet 3.0 將使 servlet 開發(fā)人員的工作更輕松,并為開發(fā)下一代 web 應(yīng)用程序提供了更多的支持。 HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
前臺js之前用jquery ajax請求servlet測試好半天才反應(yīng)過來根本不行所以就用
window.location.href這種方式請求后臺
一下后臺處理的servlet
頁面點(diǎn)擊下載按鈕觸發(fā),界面是用easyui做的,不成功跟easyui有關(guān)系?
結(jié)果就是一片空白
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
服務(wù)端的同步模式:客戶端請求 -> servlet容器創(chuàng)建線程 -> 線程中IO(可能是長時(shí)間的) -> 響應(yīng)客戶端
服務(wù)端異步模式:客戶端請求 -> servlet容器創(chuàng)建線程A -> 將長IO操作封裝到新線程B中 -> A線程釋放(客戶端繼續(xù)掛起) -> B線程完成IO -> 響應(yīng)客戶端
以上理解是否正確??
異步模式有啥好處?
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> //(1)創(chuàng)建DiskFileItemFactory對象,該對象為解析器提供解析時(shí)的缺省的配置 DiskFileItemFactory factory=new DiskFileItemFactory(); //(2)創(chuàng)建解析器 ServletFileUpload sfu=new ServletFileUpload(factory); /**(3)使用解析器解析(InputStream) *解析器會(huì)將一個(gè)表單域(比如,一個(gè)文件輸入框)中的數(shù)據(jù)封裝到一個(gè) *FileItem對象上。FileItem對象上提供了相應(yīng)的方法獲取表單域中的數(shù)據(jù) * */ try { List
items=sfu.parseRequest(request); for(int i=0;iHDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 發(fā)布在service上的單純的的一個(gè)servlet用來處理入庫數(shù)據(jù)操作,但是現(xiàn)在捕捉到的異常都打印在控制臺,查看異常還得看后臺日志,有沒有辦法把后臺日志的內(nèi)容打印到訪問servlet的頁面?重寫一個(gè)輸出頁面除外。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
執(zhí)行的時(shí)候出現(xiàn)如下的錯(cuò)誤信息: 嚴(yán)重: Servlet.service() for servlet default threw exception java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:819) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:519) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source)
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
word文件禮拜內(nèi)容為表格形式,怎么解析后能存入兩張關(guān)聯(lián)表中包括編號都存入
以下是文檔內(nèi)容和數(shù)據(jù)庫表類型
數(shù)據(jù)庫主表存入表名 表頭和編號
從表存入表格內(nèi)容
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> eova支持?jǐn)?shù)據(jù)權(quán)限嗎,多級組織機(jī)構(gòu),同一個(gè)功能看的數(shù)據(jù)權(quán)限是不一樣的
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:你好,我在練習(xí)中遇到如圖,在有多張圖片的表中,當(dāng)添加一張圖片時(shí),這幾張圖片框都顯示剛添加的那張圖片。而且在修改和查看時(shí),圖片并不顯示!
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
挨踢人員,一定要有全局觀。做事之前,先行的是規(guī)劃,也就是所謂的架構(gòu)吧。否則做成之后再來重構(gòu),其間的痛苦指數(shù),呵呵,你會(huì)明白了。
上傳eova官網(wǎng)大作,eova開發(fā)DML圖,相信看過之后就對eova怎么開發(fā)一目了然了。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 作為一個(gè)易上手、開發(fā)快的框架,EOVA確實(shí)不錯(cuò)。但對于剛?cè)腴T又懶得讀源碼和數(shù)據(jù)庫的蟲蟲們來說,有沒有更加懶的辦法呢?
思維導(dǎo)圖來了,一張圖就如把脈一樣把eova看得一清二楚,開發(fā)起來也就不會(huì)云里霧里了。
作為一個(gè)“挨踢”人士,為了不成了“挨罵”人群,有了思維導(dǎo)圖,一覽眾山小,分分鐘鐘就能把整個(gè)框架理解得八九不離十,希望大家喜歡。用百度腦圖制作,正在完善中,歡迎提意見和建議。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:
比如我的controller 為 A,里面有 act1() act2()等。
我試了LoginInterceptor.excludes("/A");LoginInterceptor.excludes("/A/act*");,似乎不支持*通配符,只能一個(gè)個(gè)的controller方法過濾LoginInterceptor.excludes("/A/act1"),不太方便。
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:
eova自帶的多表視圖能夠?qū)崿F(xiàn)修改視圖,同時(shí)修改對應(yīng)的表的值。
我自定義的表,視圖,無法修改和增加。每次提示成功,但是看日志,少了update語句。
請問,如果想實(shí)現(xiàn)修改視圖數(shù)據(jù)的同時(shí),修改表數(shù)據(jù),應(yīng)該注意哪些?
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:
其實(shí)是兩個(gè)問題:
1. 比如我有個(gè)按鈕,名字叫 button1,自定義了action。我再新增一個(gè)按鈕button2的時(shí)候,自定義的action總是調(diào)到button1的action中。
2. 感覺button有問題,實(shí)在沒法子,就數(shù)據(jù)庫刪除了eova_button表的相對應(yīng)數(shù)據(jù),再次新增按鈕,總是會(huì)顯示button2的按鈕名,新增的按鈕根本就不顯示了。
求大神指點(diǎn)。
新增按鈕操作的截圖:
彈出框:
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:
java.lang.NullPointerException
at com.eova.widget.WidgetUtil.copyValueColumn(Unknown Source)
at com.eova.widget.grid.GridController.query(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.aop.Invocation.invoke(Invocation.java:71)
at com.eova.interceptor.LoginInterceptor.intercept(Unknown Source)
at com.jfinal.aop.Invocation.invoke(Invocation.java:65)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)
at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:75)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@Jieven 你好,想跟你請教個(gè)問題:如標(biāo)題,在剛布好的項(xiàng)目中,添加修改都好著,但刪除時(shí)就是報(bào)錯(cuò)!
java.lang.Integer cannot be cast to [Ljava.lang.Object;
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
請問pyserial 如何與wxpython控件相連接控制下位機(jī)?
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
在wxpython中,我使用了wx.lib.agw.hypertreelist來創(chuàng)建帶有checkbox的樹形結(jié)構(gòu),求大神指點(diǎn)如果綁定事件來選擇單個(gè)checkbox,以及點(diǎn)擊根目錄checkbox來全選,如下圖所示:
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 我建立一個(gè)窗口,在面板上需要一定空間導(dǎo)入一張圖片,并且在圖片上要畫檢測區(qū)別作為智能識別區(qū)域?,F(xiàn)在不知道怎么畫直線并且能夠撤回不正確的直線。畫的直線不能在照片里而是針對那個(gè)區(qū)域畫。用了wxpython的畫線工具發(fā)現(xiàn)老是會(huì)覆蓋圖片而且畫完不知道怎么刪除剛剛畫的線
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
under windows, we can use SetFont to change, but under the Linux, there is no any reply if use SetFont. how to change wxpython ComboBox font size in Linux?
Thank you very much.
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
是業(yè)余學(xué)習(xí)python的,想學(xué)基礎(chǔ)后再學(xué)wxpython,也弄點(diǎn)opengl的。
各位有適于python的習(xí)題嗎?