这是自己从网上找到的主要实现方法,记录方便以后查看,也方便一些像我一样的新手参考。
第一,首先的实现接口 ServletContextListener 启动服务线程
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SocketListener implements ServletContextListener{
//socket server 线程
private SocketThread socketThread;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
if(null!=socketThread && !socketThread.isInterrupted())
{
socketThread.closeSocketServer();
socketThread.interrupt();
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
if(null==socketThread)
{
ServletContext servletContext = arg0.getServletContext();
//新建线程类
socketThread=new SocketThread(null, servletContext);
//启动线程
socketThread.start();
}
}
}
<pre name="code" class="java">//第二,实现线程类并启动socket监听
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import javax.servlet.ServletContext;
/**
* socket 线程类
*
*/
public class SocketThread extends Thread {
private ServerSocket serverSocket = null;
private ServletContext servletContext;
private int count = 0;
/*
* 构造并开始socket服务
*/
public SocketThread(ServerSocket serverScoket, ServletContext servletContext){
this.servletContext = servletContext;
// 从web.xml中context-param节点获取socket端口
int port = Integer.parseInt(this.servletContext.getInitParameter("socketPort"));
int backlog = Integer.parseInt(this.servletContext.getInitParameter("maxListen"));
String ip = this.servletContext.getInitParameter("socketIP");
try {
if(null == serverSocket){
this.serverSocket = new ServerSocket(port, backlog, InetAddress.getByName(ip));
System.out.println("socket start");
}
} catch (Exception e) {
System.out.println("SocketThread创建socket服务出错");
e.printStackTrace();
}
}
/*
* (non-Javadoc)
* @see java.lang.Thread#run()
* 等待接受客户端连接
*/
public void run(){
System.out.println("开始受连接。。。");
while(!this.isInterrupted()){
try {
Socket socket = serverSocket.accept();
if(null != socket && !socket.isClosed()){
//接收客户端连接开启一个线程处理接收的数据
count++;
new SocketOperate(socket, count).start();
}
socket.setSoTimeout(30000);
}catch (Exception e) {
e.printStackTrace();
}
}
}
public void closeSocketServer(){
try {
if(null!=serverSocket && !serverSocket.isClosed())
{
serverSocket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第三,实现处理客户端会话线程类
import java.io.IOException;
import java.io.InputStream;
//import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
//import javax.servlet.ServletContext;
/**
* socket 线程类
*
*/
public class SocketOperate extends Thread {
private Socket socket;
private int num = 0;
public SocketOperate(Socket socket, int _num) {
this.socket=socket;
this.num = _num;
}
@SuppressWarnings("unused")
public void run()
{
try{
InputStream in= socket.getInputStream();
PrintWriter out=new PrintWriter(socket.getOutputStream());
//BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
String info = "线程" + String.valueOf(num) + ":开始接收数据...";
System.out.println(info);
while(true){
//读取客户端发送的信息
String strXML = "";
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] b = new byte[count];
in.read(b);
strXML = new String(b,0,count);
//收到退出,关闭服务
if(strXML.equals("exit")){
info = "客户端" + String.valueOf(num) + ":断开连接。";
System.out.println(info);
break;
}
if(strXML.equals(""))
continue;
info = "客户端" + String.valueOf(num) + "发来:" + strXML.toString();
System.out.println(info);
/*
MethodHandler mh = new MethodHandler(ReadXML.readXML(strXML.toString()));
String resultXML = mh.getResultXML();
System.out.println("返回:"+resultXML.toString());
if(!"".equals(resultXML)){
out.print(resultXML);
out.flush();
out.close();
}
*/
} //end while
socket.close();
System.out.println("socket stop.....");
}catch(IOException ex){
ex.printStackTrace();
}finally{
}
}
}
<!-- socket 参数 -->
<context-param>
<param-name>socketPort</param-name>
<param-value>9090</param-value>
</context-param>
<context-param>
<param-name>socketIP</param-name>
<param-value>192.168.1.133</param-value>
</context-param>
<context-param>
<param-name>maxListen</param-name>
<param-value>10</param-value>
</context-param>
<!-- 开启socket服务 -->
<listener>
<listener-class>com.cjh.socket.SocketListener</listener-class>
</listener>
记录完毕。