?最近項目中要定時向前臺web頁面推送消息载绿,便用websocket來做消息推送煤辨。
websocket ?session發(fā)送文本消息有兩個方法:getAsyncRemote()和getBasicRemote() 同事推薦使用getAsyncRemote()這個方法狮辽,網(wǎng)上找了下解釋:就是getAsyncRemote是 ?非阻塞式 ? 的,getBasicRemote是 ?阻塞式 ?的竞阐,表示不懂磨取。推送消息的過程中遇到了一個bug,CSDN的一位網(wǎng)友正好遇到過這個bug, 于是順便把getAsyncRemote()和getBasicRemote() 的區(qū)別給請教了一下畔乙,那位網(wǎng)友是這樣解釋的:
getAsyncRemote()和getBasicRemote()確實是異步與同步的區(qū)別君仆,大部分情況下,推薦使用getAsyncRemote()牲距。由于getBasicRemote()的同步特性返咱,并且它支持部分消息的發(fā)送即sendText(xxx,boolean isLast). isLast的值表示是否一次發(fā)送消息中的部分消息,對于如下情況:
? ? ? ? ? ?session.getBasicRemote().sendText(message, false);?
? ? ? ? ? ?session.getBasicRemote().sendBinary(data);
? ? ? ? ? ?session.getBasicRemote().sendText(message, true);?
? ? ? ? ? ? 由于同步特性牍鞠,第二行的消息必須等待第一行的發(fā)送完成才能進(jìn)行咖摹,而第一行的剩余部分消息要等第二行發(fā)送完才能繼續(xù)發(fā)送,所以在第二行會拋出IllegalStateException異常难述。如果要使用getBasicRemote()同步發(fā)送消息萤晴,則避免盡量一次發(fā)送全部消息,使用部分消息來發(fā)送胁后。