背景
在游戏业务中,这种需求很常用,游戏大都是Socket通信。而且游戏外接的SDK,外接的平台都是HTTP Servlet供访问访问,或者GM工具都是HTTP协议的形式出现,这就需要Java web服务器的Servlet能跟socket进行游戏,目前我们的游戏中也用到了这种方式,
代码
下载最新的mina包,及相关的依赖包
- log4j-1.2.17.jar
- mina-core-2.0.16.jar
- mina-http-2.0.16.jar
- slf4j-api-1.7.25.jar
- slf4j-log4j12-1.7.25.jar
新建java web项目,把上面相应的包,copy进:WebContent/WEB-INF/lib
编写类:ClientHandler,用于处理Mina Socket连接的IOHandler,代码如下:
package com.nikoer.mina; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; public class ClientHandler implements IoHandler { public static final Mapresults = new ConcurrentHashMap (); @Override public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception { // TODO Auto-generated method stub } @Override public void inputClosed(IoSession arg0) throws Exception { // TODO Auto-generated method stub } @Override public void messageReceived(IoSession session, Object message) throws Exception { // TODO Auto-generated method stub String flag = (String)session.getAttribute("SendRequestFlag"); results.put(flag, message); session.closeNow(); } @Override public void messageSent(IoSession arg0, Object arg1) throws Exception { // TODO Auto-generated method stub } @Override public void sessionClosed(IoSession arg0) throws Exception { // TODO Auto-generated method stub } @Override public void sessionCreated(IoSession arg0) throws Exception { // TODO Auto-generated method stub } @Override public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { // TODO Auto-generated method stub } @Override public void sessionOpened(IoSession arg0) throws Exception { // TODO Auto-generated method stub } }
新建 Servlet类:
package com.nikoer.mina; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; /** * Servlet implementation class HelloMinaServlet */ @WebServlet("/HelloMinaServlet") public class HelloMinaServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloMinaServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String param1 = request.getParameter("param1"); IoConnector connector = new NioSocketConnector(); connector.setHandler(new ClientHandler()); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", 3456)); future.awaitUninterruptibly(); IoSession session = future.getSession(); String flag = request.getLocalAddr() + UUID.randomUUID().toString(); session.setAttribute("SendRequestFlag", flag); session.write(param1+"\n"); session.getCloseFuture().awaitUninterruptibly(); connector.dispose(); Object result = ClientHandler.results.get(flag); ClientHandler.results.remove(flag); response.getWriter().write(result.toString()); } }
运行Servlet进行测试,当前这里的Socket服务器可以是任意的服务器。也可以用Mina来开发一个Socket服务器进行测试