java web工程启动socket服务
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服务的更多相关文章
- SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)
1.首先知道SpringBoot打包为jar和war包是不一样的(只讨论SpringBoot环境下web应用打包) 1.1.jar和war包的打开方式不一样,虽然都依赖java环境,但是j ...
- Tomcat设置默认启动项目及Java Web工程设置默认启动页面
Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...
- Maven启动Java Web工程,8081和8086端口号被占用
Maven启动Java Web工程, <!-- 配置tomcat插件 --> <build> <plugins> <plugin> <groupI ...
- 服务器启动socket服务报错 java.net.BindException:Cannot assign requested address
错误信息: 2017-06-13 11:18:00,865 [GateServer.java:82][ERROR]:启动服务出错了java.net.BindException: Cannot ass ...
- Eclipse创建java web工程
Eclipse创建java web工程 eclipse版本:eclipse-jee-4.5-win32-x64 tomcat版本:apache-tomcat-7.0.63-windows-x64 jd ...
- java web工程的错误页面的简单配置
jsp页面,本身服务器也会将该页面翻译成一个servlet页面,所以请求该页面就会有可能出现错误的情况,就会出现下面类似的页面 这样给客户看到并不友好. 1.jsp页面<%@ page %> ...
- 于Heroku平台部署maven webapp(java web)工程
眼下,需要Heroku上述部署java web工程,该项目必须使用maven管理 一:新maven webapp工程 编者pom.xml档,增加下面的配置为例, <project xmlns=& ...
- eclipse--java工程转web工程 以及 java或java web工程转maven工程
1. 打开工程文件夹,编辑工程的.project文件. 在<natures></natures>中加入 <nature>org.eclipse.wst.commo ...
- 使用Java web工程建立Maven Web Module工程
1. 前言 之前有一篇关于搭建S2SH的文章中提到建立Maven Web Module工程,有人反馈说这个方面不会.那还是唠叨一下,写篇文章说明一下吧. 建立Maven Web Module的方式有多 ...
随机推荐
- 0608pm单例模式and面向对象的六大原则
//把类控制住,不让外界造她的对象class DA{ public $name; static private $dx;//存放对象的变量 //将构造变为私有,外界没法造对象 private func ...
- mysql插入一张表里的数据到另一张表
公司的一个项目,做报表--要关联的表结构比较多,最后决定把要用的数据集合到一张新表中,需要用到以下的sql语法......分享下: web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要 ...
- spring data jpa是什么?
JPA是一个Java编程语言接口规范,Hibernate ORM是JPA规范的一个实现. Spring Data JPA能干什么 在开始之前,先举个简单的例子. 一张表user有三个字段,id.n ...
- Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软 ...
- 【转载】用Scikit-Learn构建K-近邻算法,分类MNIST数据集
原帖地址:https://www.jiqizhixin.com/articles/2018-04-03-5 K 近邻算法,简称 K-NN.在如今深度学习盛行的时代,这个经典的机器学习算法经常被轻视.本 ...
- java基础学习总结——java环境变量配置(转)
只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...
- CodeWars上的JavaScript技巧积累
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice The sli ...
- 文件系统中跳转【TLCL】
pwd - Print name of current working directory cd - Change directory ls - List directory contents Lin ...
- iOS APP AppIcon& LaunchImage
AppIcon size for iPhone: 29 - Settings @1x 29*29, 58 - Settings @2x 58*58, 87 - Settings @3x 87*87 ...
- 中文乱码之myEclipse项目导入时中文乱码(待)
方法1:检查默认的编码是否设置成utf-8. 步骤如图: window——>preferences... 若Text file encoding 中的编码为 Other == UTF-8 ,则已 ...