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. Shortcut Keys in Eclipse

    @1: Here are some shortcut keys in Eclipse that I use a lot.Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开 ...

  2. 标准c数学函数使用方法

    cppreference.com -> 标准c数学函数 -> 详解 标准c数学函数 abs 语法:     #include <stdlib.h>   int abs( int ...

  3. $.messager.confirm修改弹出框按钮提示文字

    $.messager.confirm 默认提示语为“OK”和“Cancel”.引入中文控件后变为“确定”和“取消” <script src="../js/locale/easyui-l ...

  4. asp.net 下载图片

    public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...

  5. Swift进阶 - 12个技巧

    听说你已经学习Swift几个月了,有没有想更进一步成为Swift高手的想法?我这里有11招秘技,各位施主且听我慢慢道来,结个善缘. 1. 扩展(Extension) 任务: 求数字的平方. // 菜鸟 ...

  6. 【HackerRank】Cut the tree

    题目链接:Cut the tree 题解:题目要求求一条边,去掉这条边后得到的两棵树的节点和差的绝对值最小. 暴力求解会超时. 如果我们可以求出以每个节点为根的子树的节点之和,那么当我们去掉一条边(a ...

  7. [POI2007]立方体大作战tet

    题目 BZOJ 洛谷 做法 很巧妙的题,注意每种颜色只有两个 消除一种颜色,其实就是看中间有多少个没有被消除的块,这种动态距离问题显然能用树状数组解决 洛谷输出方案,暴力往下爬就行 My comple ...

  8. HTML如何禁止文本框输入

    禁止文本框输入有以下两种方法: 1,设置input为只读状态,代码如下: <input readonly="readonly" value="test1" ...

  9. MySQL数据库基本操作(一)

    进入mysql 本地连接: mysql -u用户名 -p 输入密码 qwe123 mysql -uroot -pqwe123 sudo apt-get install mysql-server # p ...

  10. Anaconda创建环境、删除环境、激活环境、退出环境

    Anaconda创建环境: //下面是创建python=3.6版本的环境,取名叫py36 conda create -n py36 python=3.6  删除环境(不要乱删啊啊啊) conda re ...