? ? ? ? 最近,由于生活壓力過大就找個(gè)公司進(jìn)行工作,沒想到的是這個(gè)公司是個(gè)外包公司各式各樣的項(xiàng)目都能接到。
? ? ? ? 有句話說的好夫啊,那就是外包公司最漲技術(shù),因?yàn)樵诠纠锸裁礃拥捻?xiàng)目都可能遇得到辆憔,及時(shí)以前沒做過的在這也能遇到撇眯,無論是web還是游戲通吃。
? ? ? ? 這段時(shí)間經(jīng)手好幾個(gè)項(xiàng)目了虱咧,多數(shù)是游戲熊榛,對(duì)于游戲來說那就是實(shí)時(shí)連接的,最好的選擇就是就是socket或者websocket腕巡,今天就來說一下我遇到的這些小問題吧来候!
? ? ? ? ? 一、在SpringBoot+Redis+WebSocket的環(huán)境下編寫的程序有很多逸雹,那么一定有人會(huì)遇到這個(gè)問題就是不知道如何進(jìn)行下手
? ? ? ? ? ? ? ? ? 直接進(jìn)行創(chuàng)建一個(gè)類在類的上面寫上注解@Component還有@ServerEndpoint(value = "/game/{roomId}")
然后在類中寫上3個(gè)方法分別用來打開营搅、接受數(shù)據(jù)、關(guān)閉使用的回調(diào) 梆砸,看不不懂文字那就接下來看代碼圖片:圖一
這里注意的是 @OnOpen是有客戶端進(jìn)入會(huì)走的方法? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?@OnClose是有客戶端網(wǎng)絡(luò)中斷會(huì)走转质,主動(dòng)斷開也會(huì)走
? ? ? ? ? ? ? ? ? ? ? ? @OnMessage是客戶端發(fā)的數(shù)據(jù) str就是發(fā)送的內(nèi)容
綜上所述WebSocket只能進(jìn)行傳輸字符串也就是文本型,這就對(duì)了C\C++\C#不太友好帖世,這里有有個(gè)小技巧就是可以把數(shù)據(jù)封裝成類休蟹,使用工具轉(zhuǎn)成json,眾所周知json就是字符串日矫,不懂json是什么的親們也不要著急以后我會(huì)進(jìn)行解釋的
? ??????????????????????注意:這里的注解不能變方法名是可以隨意更改的? ?
? ??????????????????????這里還要注重的說一下@OnError這個(gè)注解public void onError(Session session,Throwable error){
? ??????????????????????這里還要注重的說一下@OnError這個(gè)注解public void onError(Session session,Throwable error){
? ??????????????????????這里還要注重的說一下@OnError這個(gè)注解public void onError(Session session,Throwable error){
? ? ? ? 這里為什么@OnError寫錯(cuò)了這個(gè)運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)赂弓,這個(gè)稍后下面會(huì)說到
? ? 二、寫了WebSocket但是無法進(jìn)行連接哪轿,這個(gè)如何出了呢盈魁?
? ? ? ? 這個(gè)就是在Spring中我們沒有把WebSocket注入進(jìn)去,那么我們就要把它裝進(jìn)去那就是使用配置類進(jìn)行加載窃诉,我們創(chuàng)建一個(gè)類進(jìn)行注入ServerEndpointExporter杨耙,在類上加注解@Configuration在類中寫一個(gè)@Bean進(jìn)行注入 ,文字看不懂我們看圖:圖二
? ?不要問為什么這樣寫就可以注入進(jìn)去飘痛,然后啟動(dòng)服務(wù)使用測(cè)試工具連接你就能發(fā)現(xiàn)神奇的是連上了
? ???????????????????注意:這里一定要注意這個(gè)類是將WebSocket注入到Spring中的那么發(fā)布到服務(wù)器的時(shí)候一定要把這個(gè)類屏蔽掉因?yàn)閟pring中內(nèi)置的tomcat和服務(wù)器上的服務(wù)器是有區(qū)別的這個(gè)一定要注意
? ??????????????????????發(fā)布到服務(wù)器的時(shí)候一定要把這個(gè)類屏蔽掉
? ??????????????????????發(fā)布到服務(wù)器的時(shí)候一定要把這個(gè)類屏蔽掉
? ??????????????????????發(fā)布到服務(wù)器的時(shí)候一定要把這個(gè)類屏蔽掉
? ? ? ? ? ? 三珊膜、寫的時(shí)候都是正常的但是編譯的時(shí)候抱了一大堆的錯(cuò)誤,百度也沒有什么結(jié)果怎么辦宣脉,別著急先來看看下表面有沒有你煩的錯(cuò)誤车柠,當(dāng)然下面的錯(cuò)誤也是我遇到的,看看我是怎么解決的吧!
? ? ? ? ? ? ? ? ? ? 報(bào)錯(cuò)一竹祷、
java.lang.IllegalStateException: Failed to register @ServerEndpoint class: class com.dreamwhale.pokermister.socket.GameSocket
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.java:159)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoints(ServerEndpointExporter.java:134)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterSingletonsInstantiated(ServerEndpointExporter.java:112)?
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:864)?
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)?
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)?
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)?
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)?
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)?
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)?
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)?
at com.dreamwhale.pokermister.PokerMisterApplication.main(PokerMisterApplication.java:10)
Caused by: javax.websocket.DeploymentException: No Throwable parameter was present on the method [onError] of class [com.dreamwhale.pokermister.socket.GameSocket] that was annotated with OnError
at org.apache.tomcat.websocket.pojo.PojoMethodMapping.getPathParams(PojoMethodMapping.java:325)?
at org.apache.tomcat.websocket.pojo.PojoMethodMapping.<init>(PojoMethodMapping.java:194)?
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:154)?
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:278)
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:228)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.java:156)?
... 12 common frames omitted
????????????這里我們進(jìn)行分析一下介蛉,這個(gè)錯(cuò)誤錯(cuò)在哪里了呢?溶褪,當(dāng)然我在上面已經(jīng)標(biāo)注了币旧,就是這個(gè)錯(cuò)誤,仔細(xì)的看一下猿妈,我文章一開始寫的那個(gè)是不是多了一個(gè)@OnError導(dǎo)致的這個(gè)問題啊
? ? ? ? ? ? 哪有的朋友說了吹菱,我報(bào)的錯(cuò)誤跟這個(gè)相似但是不是這個(gè)錯(cuò)誤,再次我跟大家說像這樣的錯(cuò)誤只需要看我加粗加杠的字那個(gè)位置的錯(cuò)誤提示
例如下面這個(gè)錯(cuò)誤
java.lang.IllegalStateException: Failed to register @ServerEndpoint class: class com.dreamwhale.pokermister.socket.GameSocket
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.java:159)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoints(ServerEndpointExporter.java:134)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterSingletonsInstantiated(ServerEndpointExporter.java:112)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:864)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)?
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)?
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)?
at com.dreamwhale.pokermister.PokerMisterApplication.main(PokerMisterApplication.java:10)
Caused by: javax.websocket.DeploymentException: The path [game] is not valid.
at org.apache.tomcat.websocket.server.UriTemplate.<init>(UriTemplate.java:48) ~[tomcat-embed-websocket-9.0.26.jar:9.0.26]
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:161)
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:278)?
at org.apache.tomcat.websocket.server.WsServerContainer.addEndpoint(WsServerContainer.java:228)?
at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.java:156)?
... 12 common frames omitted
? ? ? ? 這個(gè)報(bào)錯(cuò)也是一個(gè)小失誤他提示的這個(gè)路徑是無效的那么我們檢查一下WebSocket是不是寫成了這樣
? ??????????????@ServerEndpoint(value ="game")
本文章是本人在工作中遇到的一些小問題彭则,那么想了解更多java只是可以關(guān)注我鳍刷,我會(huì)不定時(shí)更新文章,可能有你需要的喲俯抖!點(diǎn)個(gè)關(guān)注再走输瓜!