这是一个封装好的WebSocket服务器,通过简单的扩展就可以实现基于websocket的服务。写这个工具的主要目的是为了用于方便websocket应用的前端和服务器同时开发。
比如做HTML5游戏一般都是服务器和客户端同时开发。在开发之前最重要的就是制定通信协议,但游戏客户端在开发时可能需要调用接口,此时如果服务器端还未实现的话,就可能影响客户端的开发工作,用这个就可以解决问题。
可以在开发游戏客户端前,完成通信接口的简单实现,下面是一个调用示例:
import org.json.JSONException; import org.json.JSONObject; import com.hoverlees.ws.*; public class Test implements WebSocketHandler { private int id=1; public Test(){ WebSocketServer server; server=new WebSocketServer(8766); server.setHandler("/", this); try { server.start(); } catch (WebSocketServerException e) { e.printStackTrace(); } } public static void main(String[] args){ new Test(); } @Override public void onConnect(WebSocketServer server,WebSocketSession session) { System.out.println("用户["+id+"]进入."); session.userData=id; id++; server.sendPacket(session, ("Hello!".getBytes())); } @Override public void onPacket(WebSocketServer server,WebSocketSession session, WebSocketPacket packet) { System.out.println("收到用户["+session.userData+"]数据: \""+packet.getStringData()+"\""); try{ JSONObject obj=new JSONObject(packet.getStringData()); String cmd=obj.getString("cmd"); if(cmd.equals("add")){ int sum=obj.getInt("a")+obj.getInt("b"); server.sendPacket(session, ("a+b="+sum).getBytes()); } else if(cmd.equals("sub")){ int sub=obj.getInt("a")-obj.getInt("b"); server.sendPacket(session, ("a-b="+sub).getBytes()); } }catch(JSONException e){ e.printStackTrace(); } } @Override public void onDisconnect(WebSocketServer server,WebSocketSession session) { System.out.println("用户["+session.userData+"]退出."); } }
类库下载地址:
http://www.hoverlees.com/diy/sources/hwebsocket/hWebSocket.zip
为了方便搜索引擎进入的观众,加了些链接查看源代码:
Test
com.hoverlees.http.HTTPRequestParser
com.hoverlees.utils.Base64Encoder
com.hoverlees.ws.WebSocketHander
com.hoverlees.ws.WebSocketPacket
com.hoverlees.ws.WebSocketServerException: Error 2: 无法创建Socket
at com.hoverlees.ws.WebSocketServer.start(WebSocketServer.java:99)
at Test.(Test.java:13)
at Test.main(Test.java:19)
你好,先谢谢你的讲解,我遇到这个问题不知道那个地方出错,新手望解答,谢谢
你好,可以在throw new WebSocketServerException前面加上e.printStackTrace();
我估计是端口被占用导致的。