1. 程式人生 > >關於javaweb 項目 ssm框架 啟動tomcat服務器同時啟動一個socket服務

關於javaweb 項目 ssm框架 啟動tomcat服務器同時啟動一個socket服務

sin trac ppr length sed write -1 接受 ngs

1.創建監聽類

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
* 將socket service隨tomcat啟動
* @author huajian
*/
public class SocketServiceLoader 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)
{
//新建線程類
socketThread=new SocketThread(null);
//啟動線程
socketThread.start();
}
}
}

2.創建生產socket線程類:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.servlet.ServletContext;

/**
* socket 線程類
* @author huajian
*/
public class SocketThread extends Thread{
private ServerSocket serverSocket = null;

public SocketThread(ServerSocket serverScoket){
try {
if(null == serverSocket){
this.serverSocket = new ServerSocket(4700);
System.out.println("socket start");
}
} catch (Exception e) {
System.out.println("SocketThread創建socket服務出錯");
e.printStackTrace();
}

}

public void run(){
while(!this.isInterrupted()){
try {
Socket socket = serverSocket.accept();

if(null != socket && !socket.isClosed()){
//處理接受的數據
new SocketOperate(socket).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();
}
}
}

3.創建處理客戶端發送報文的類:

import java.io.BufferedReader;
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接收的數據
* @author huajian
*
*/
public class SocketOperate extends Thread{
private Socket socket;

public SocketOperate(Socket socket) {
this.socket=socket;
}
@SuppressWarnings("unused")
public void run()
{
try{

InputStream in= socket.getInputStream();

PrintWriter out=new PrintWriter(socket.getOutputStream());

//BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));

while(true){
//讀取客戶端發送的信息
String strXML = "";
byte[] temp = new byte[1024];
int length = 0;
while((length = in.read(temp)) != -1){
strXML += new String(temp,0,length);
}
if("end".equals(strXML)){
System.out.println("準備關閉socket");
break;
}
if("".equals(strXML))
continue;

System.out.println("客戶端發來:"+strXML.toString());

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


}
socket.close();
System.out.println("socket stop.....");

}catch(IOException ex){

}finally{

}
}
}

4.配置web.xml中配置監聽

<listener>
  <listener-class>com.novolion.wateriot.server.SocketServiceLoader</listener-class>
</listener>

關於javaweb 項目 ssm框架 啟動tomcat服務器同時啟動一個socket服務