1、新建web工程

2、自定义类 实现ServletContextListener 接口

在contextInitialized方法中启动socket服务的线程

在contextDestroyed方法中关闭socket线程的服务,释放监听端口

3、更改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_IDsocket Server</display-name>
<context-param>
<param-name>socketPort</param-name>
<param-value>8888</param-value>
</context-param>
<listener>
<description>Socket</description>
<listener-class>myserver.ServerSocketListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

4、tomcat发布服务即可

注:需进入servlet-api.jar包

附示例代码

public class ServerSocketListener implements ServletContextListener
{
private SocketThread socketThread; public void contextDestroyed(ServletContextEvent e)
{
if (socketThread != null && socketThread.isInterrupted())
{
socketThread.closeServerSocket();
socketThread.interrupt();
}
} public void contextInitialized(ServletContextEvent e)
{
ServletContext servletContext = e.getServletContext();
System.out.println("Server contextInitialized over");
if (socketThread == null)
{
socketThread = new SocketThread(null, servletContext);
socketThread.start();
}
}
}
class SocketThread extends Thread
{
Integer count = 0;
private ServletContext servletContext;
private ServerSocket serverSocket; public SocketThread(ServerSocket serverSocket, ServletContext servletContext)
{
this.servletContext = servletContext;
// 从web.xml中context-param节点获取socket端口
String port = this.servletContext.getInitParameter("socketPort");
if (serverSocket == null)
{
try
{
this.serverSocket = new ServerSocket(Integer.parseInt(port));
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public void run()
{
try
{
Integer count = 0;
while (!this.isInterrupted())
{
MyServer.rerfresh(); Socket socket = serverSocket.accept();
count++;
System.out.println("Server SocketThread start:"+count);
if (socket != null)
{
SocketClientBean client = new SocketClientBean();
client.setSocket(socket);
MyServer.clientlist.add(client); System.out.println("new commer:"+socket.getRemoteSocketAddress().toString());
MyServer.invoke(socket);
}
}
}
catch (Exception ex)
{
System.out.println("SocketThread err:"+ex.getMessage());
}
} public void closeServerSocket()
{
try
{
if (serverSocket != null && !serverSocket.isClosed())
{
serverSocket.close();
MyServer.destroyedTimer();
} }
catch (Exception ex)
{
System.out.println("SocketThread err:"+ex.getMessage());
}
}
}
public class MyServer
{
public static List<SocketClientBean> clientlist = new ArrayList<SocketClientBean>();private static Timer timer = new Timer(); public static void rerfresh()
{
timer.schedule(new MyClientRefreshTask(), 1000*0, 1000*15);
}
public static void destroyedTimer()
{
if(timer1!=null)
{
timer1.cancel();
}
if(timer!=null)
{
timer.cancel();
}
} public static void invoke(final Socket client) throws IOException
{
new Thread(new Runnable()
{
public void run()
{
String errcmd = "{\"cmd\":-1}";
String nocmd = "{\"cmd\":0}"; BufferedReader in = null;
PrintWriter out = null;
try
{
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(client.getOutputStream());
Integer count = 0;
while (true)
{
String cmdmsg = in.readLine();
count++;
System.out.println(count);
System.out.println("Server received " + cmdmsg); JSONObject jsmsg = JSONObject.fromObject(cmdmsg);
System.out.println("JSONObject success");
String cmd = jsmsg.getString("cmd");
switch (cmd)
{
case "1":
com.progress.cmd1.process(client, jsmsg);
break;
case "2":
com.progress.cmd2.process(client, jsmsg);
break;default:
out.println(nocmd);
out.flush();
}
if (cmdmsg.equals("bye"))
{
break;
}
}
}
catch (JSONException ex)
{
System.out.println("JSONObject err");
out.println(errcmd);
out.flush();
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
in.close();
}
catch (Exception e)
{
}
try
{
out.close();
}
catch (Exception e)
{
}
try
{
client.close();
}
catch (Exception e)
{
}
}
}
}).start();
}
static class MyClientRefreshTask extends java.util.TimerTask
{
public void run()
{
refreshClient();
}
}
private static void refreshClient()
{
List<SocketClientBean> dels = new ArrayList<SocketClientBean>();
for (int i = 0; i < MyServer.clientlist.size(); i++)
{
if (MyServer.clientlist.get(i).getSocket().isClosed())
{
System.out.println("it is the del client!");
dels.add(clientlist.get(i));
}
}
System.out.println("clientlist num:"+clientlist.size());
System.out.println("dels num:"+dels.size());
clientlist.removeAll(dels);
System.out.println("clientlist left num:"+clientlist.size());
} }

java web工程启动socket服务的更多相关文章

  1. SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)

      1.首先知道SpringBoot打包为jar和war包是不一样的(只讨论SpringBoot环境下web应用打包)     1.1.jar和war包的打开方式不一样,虽然都依赖java环境,但是j ...

  2. Tomcat设置默认启动项目及Java Web工程设置默认启动页面

    Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...

  3. Maven启动Java Web工程,8081和8086端口号被占用

    Maven启动Java Web工程, <!-- 配置tomcat插件 --> <build> <plugins> <plugin> <groupI ...

  4. 服务器启动socket服务报错 java.net.BindException:Cannot assign requested address

    错误信息:  2017-06-13 11:18:00,865 [GateServer.java:82][ERROR]:启动服务出错了java.net.BindException: Cannot ass ...

  5. Eclipse创建java web工程

    Eclipse创建java web工程 eclipse版本:eclipse-jee-4.5-win32-x64 tomcat版本:apache-tomcat-7.0.63-windows-x64 jd ...

  6. java web工程的错误页面的简单配置

    jsp页面,本身服务器也会将该页面翻译成一个servlet页面,所以请求该页面就会有可能出现错误的情况,就会出现下面类似的页面 这样给客户看到并不友好. 1.jsp页面<%@ page %> ...

  7. 于Heroku平台部署maven webapp(java web)工程

    眼下,需要Heroku上述部署java web工程,该项目必须使用maven管理 一:新maven webapp工程 编者pom.xml档,增加下面的配置为例, <project xmlns=& ...

  8. eclipse--java工程转web工程 以及 java或java web工程转maven工程

    1.  打开工程文件夹,编辑工程的.project文件. 在<natures></natures>中加入 <nature>org.eclipse.wst.commo ...

  9. 使用Java web工程建立Maven Web Module工程

    1. 前言 之前有一篇关于搭建S2SH的文章中提到建立Maven Web Module工程,有人反馈说这个方面不会.那还是唠叨一下,写篇文章说明一下吧. 建立Maven Web Module的方式有多 ...

随机推荐

  1. 前端基础之JavaScript_(1)_ECMAScript

    一.JavaScript概述 JavaScript的历史 992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase. ...

  2. SpringMVC:学习笔记(4)——处理模型数据

    SpringMVC—处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...

  3. Informatica can bind a LONG value only for insert into a LONG column Oracle

    Informatica实现etl同步表数据信息时 报: Severity Timestamp Node Thread Message Code Message ERROR 2016/8/8 17:32 ...

  4. PHPExcel读写封装

    <? require_once ('inc/PHPExcel/PHPExcel/IOFactory.php'); /** * @author lgl * 使用实例 * $fieldMap=['昵 ...

  5. rsh命令配置于使用

    安装环境:一台centos6.10虚拟机,一台centos7.5虚拟机,全部使用root用户登录. 两台机器上都要安装rsh.rsh-server.xinetd包. 两台机器都要关闭防火墙并配置/et ...

  6. 【读书笔记】《Java Web整合开发实践》第3章 JSP

    1. JSP:Java Server Pages 2. JSP注释:<%--注释内容--%> 3. page指令(页面指令):定义JSP页面的全局属性. <%@ page langu ...

  7. 如何在IAR中配置CRC参数(转)

    源:如何在IAR中配置CRC参数 前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间.CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时 ...

  8. [POI2007]驾驶考试egz

    题目 BZOJ 神仙题,可比那些氵紫题有意思多了 做法 \(i\)能作为起始点,当\(i\)能到达\(1\)~\(i-1\)和\(i+1\)~\(n\) 这样处理显然会麻烦,因为要从每个点都特判一次 ...

  9. Apache的order、allow、deny

    Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权. 所以,最常用的是:Or ...

  10. PHP类的变量与成员,及其继承、访问与重写要注意的问题

    PHP的类及其实例: <?php ?>  后期静态绑定:为了避免子类重写静态属性后,使用继承来的方法仍然方法父类的静态属性,PHP5.3增加了一个新的语法,后期静态绑定,使用static关 ...