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());
} }

最新文章

  1. hdu5714 拍照[2016百度之星复赛C题]
  2. HTTP Methods: GET v.s POST
  3. c# webform网站图片另存代码
  4. UVALive-4329 Ping pong (树状数组)
  5. linux用VSFTP搭建FTP服务器
  6. WisDom.Net 框架设计(五) 权限设计
  7. C++创建动态链接库(*.dll)
  8. Java数据流的一般操作规律总结
  9. 从零自学Hadoop(23):Impala介绍及安装
  10. hdu1116有向图判断欧拉通路判断
  11. loongson 2f 和u-boot中的cache命令对照
  12. 基于CSS属性display:table的表格布局的使用
  13. 正则表达式re.sub替换不完整的问题现象及其根本原因
  14. CentOS7配置samba服务
  15. 如何快速搭建&amp;配置本地服务器-前端技能
  16. 也谈同步异步I/O
  17. php之code tips
  18. vue中封装公共方法,全局使用
  19. [MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)
  20. MySQL数据库localhost的root用户登陆遭遇失败

热门文章

  1. NodeJS应用程序设置为window service-辅助工具(C#)
  2. asp.net 下载图片
  3. VC:res协议——从模块中获取资源
  4. 每天一个Linux命令(44)crontab命令
  5. Dubbo框架入门介绍
  6. 建议47:使用logging记录日志信息
  7. 建议44:理解模块pickle优劣
  8. UCOS2_STM32F1移植详细过程
  9. Docker容器技术-镜像分发
  10. jquery图片过滤归类应用