logo资料库

WEB服务器启动时加载一个ServerSocket服务.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
ServerSocket WEBWEBWEBWEB 服务器启动时加载一个 ServerSocket ServerSocket ServerSocket 服务 yunfeiyang08@gmail.com 如果在项目中需要让一个 ServerSocket 服务伴随 WEB 服务器的启动而启动,时刻监控某个 端口,接收 Socket 客户端发送过来的 socket 报文。需要做以下配置,配置完成后程序支持 随服务器启动,支持同时处理多个 socket 客户端请求。 1.配置 web.xml 在 web.xml 的节点中添加以下内容: socketPort 3800 Socket 服务随 web 启动而启动 service.ServerSocketListener 注:网上也有人提出可以使用 servlet 节点进行配置,具体如下: Test service.ServerSocketServlet 3 这样做有一个很大的问题,就是服务器关闭时资源无法得到完全释放,端口可能仍然被占用 2.编写监听器 Listener 中配置的类 ServerSocketListener 类需要实现 ServletContextListener class ServerSocketListener implements implements ServletContextListener { implements class public public class implements public class public private SocketThread socketThread; private private private public voidvoidvoidvoid contextDestroyed(ServletContextEvent e) { public public public ifififif (socketThread != nullnullnullnull && socketThread.isInterrupted()) { socketThread.closeServerSocket(); socketThread.interrupt(); } } public voidvoidvoidvoid contextInitialized(ServletContextEvent e) { public public public ServletContext servletContext = e.getServletContext(); ifififif (str == nullnullnullnull && socketThread == nullnullnullnull) { socketThread = newnewnewnew SocketThread(nullnullnullnull, servletContext); socketThread.start(); // servlet上下文初始化时启动socket服务端线程 Page 1
yunfeiyang08@gmail.com } } } /** * 自定义一个Socket线程类继承自线程类,重写run()方法,用于接收客户端socket请求报文 */ class SocketThread extends extends Thread { extends class class extends class private ServletContext servletContext; private private private private ServerSocket serverSocket; private private private public SocketThread(ServerSocket serverSocket, ServletContext servletContext) { public public public thisthisthisthis.servletContext = servletContext; // 从web.xml中context-param节点获取socket端口 String port = thisthisthisthis.servletContext.getInitParameter("socketPort"); ifififif (serverSocket == nullnullnullnull) { trytrytrytry { thisthisthisthis.serverSocket = newnewnewnew ServerSocket(Integer.parseInt(port)); catch (IOException e) { } catch catch catch e.printStackTrace(); } } } public voidvoidvoidvoid run() { public public public while (!thisthisthisthis.isInterrupted()) { // 线程未中断执行循环 while while while trytrytrytry { Socket socket = serverSocket.accept(); ifififif (socket != nullnullnullnull) newnewnewnew ProcessSocketData(socket, thisthisthisthis.servletContext).start(); catch (IOException e) { } catch catch catch e.printStackTrace(); } } } public voidvoidvoidvoid closeServerSocket() { public public public trytrytrytry { ifififif (serverSocket != nullnullnullnull && !serverSocket.isClosed()) serverSocket.close(); catch (IOException e) { } catch catch catch e.printStackTrace(); } } } Socket消息报文处理类 Page 2
yunfeiyang08@gmail.com class ProcessSocketData extends extends Thread { extends class class extends class private Socket socket; private private private private ServletContext servletContext; private private private public ProcessSocketData() { public public public super(); super super super } public ProcessSocketData(Socket socket, ServletContext servletContext) { public public public thisthisthisthis.socket = socket; thisthisthisthis.servletContext = servletContext; } public voidvoidvoidvoid run() { public public public trytrytrytry { BufferedReader br = newnewnewnew BufferedReader(newnewnewnew InputStreamReader( socket.getInputStream())); PrintWriter pw = newnewnewnew PrintWriter(socket.getOutputStream()); String request = br.readLine(); // 从流中读取请求消息报文 // 执行自定义的请求解析方法,生成响应response pw.println(response); pw.flush(); // 刷新缓冲区 } catch catch (IOException e) { catch catch e.printStackTrace(); } } } 3.一个简单的 Socket 客户端,用于验证以上程序 class TestClient { class public public class public class public public voidvoidvoidvoid createSocketClient(String host, intintintint port) { public public public Socket socket = nullnullnullnull; PrintWriter pw = nullnullnullnull; BufferedReader br = null; null; null; null; trytrytrytry { String request = "20110624"; socket = newnewnewnew Socket(host, port); pw = newnewnewnew PrintWriter(newnewnewnew OutputStreamWriter(socket.getOutputStream())); pw.println(request[i]); pw.flush(); br = new BufferedReader(new InputStreamReader( socket.getInputStream())); System.out.println(br.readLine()); } catch catch (Exception e) { catch catch e.printStackTrace(); } Page 3
yunfeiyang08@gmail.com } static voidvoidvoidvoid main(String[] args) { static public public static public static public TestClient client = newnewnewnew TestClient(); client.createSocketClient("127.0.0.1", 3800); } } Page 4
分享到:
收藏