package com.hereim.server;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import org.apache.log4j.Logger;/*
 * 创建线程并启动服务
 */
public class IMServer extends Thread { private final int THREAD_POOL = 1000;   //线程数量
    
private ExecutorService threadPool = null;
    
IUdpService udpService = null;
    
private Logger logger = Logger.getLogger(this.getClass());
    
    public IMServer(int port){       
     UdpService serv = new UdpService();        
     udpService = serv.createService(port);    
    
     //创建10个线程
        threadPool = Executors.newFixedThreadPool(THREAD_POOL);
        logger.debug("IM服务器启动成功 端口["+port+"]......");
    }    public void run() {     
     while (true) {
     try {   
     // UDP            
     byte buffer[] = new byte[256];    
          DatagramPacket packet = new DatagramPacket(buffer,buffer.length);   
         
          udpService.getServiceSocket().receive(packet);  //在这里阻塞
          //sleep(2000);
          threadPool.execute(new ThreadForSocket(udpService,packet));         
    
             // TCP
            
            } catch (Exception e) {
             System.out.println(e);
            }     
     }
    }
 //
    
    private class ThreadForSocket extends Thread {
    
     IUdpService m_udpService = null;
     DatagramPacket m_packet = null;
    
     public ThreadForSocket(IUdpService udpService,DatagramPacket packet){
     m_udpService = udpService;
     m_packet = packet;
     }
    
     public void run() {  
     try{
     if(HandleReceivePacket(m_packet)>0)   
     sendPacket();  
     logger.debug("parseXML end;");
//     System.out.println("++++++++++++close:"+m_udpService.closeSocket(9901));
     }catch(Exception e){
     e.printStackTrace();
     }finally{
//     System.out.println("++++++++++++start:"+m_udpService.startSocket(9901));
     //Thread.interrupted();
     System.gc();
     //Future future = null ;
     //future.cancel(true);
     }
    
        }
    
     private int HandleReceivePacket(DatagramPacket packet){
         byte[]data =packet.getData();
         int len = packet.getLength();   
         if(m_udpService.getServiceName().compareToIgnoreCase("CONNECTION") != 0){
         m_udpService.setRemoteIp(packet.getAddress().toString());
         m_udpService.setRemotePort(packet.getPort());
         logger.debug("DatagramPacket--->ip:"+packet.getAddress().toString());
         logger.debug("DatagramPacket--->port:"+packet.getPort());
         }
           try{
            String inXML = new String(data,0,len,"UTF-8");  
            logger.debug("request:"+inXML);
            m_udpService.parseXML(inXML);
           
           }catch(Exception e)
           { System.out.println(e);}
        
         return 1;
        }
    
     private void sendPacket(){        
         try {
         String outXML = m_udpService.buildXML();
         logger.debug("buildXML end;");
         logger.debug("send xml:" + outXML);
         if(outXML != null){
                byte[] buffer = outXML.getBytes("UTF-8");  
                InetAddress address = m_packet.getAddress();
                int port = m_packet.getPort();
                m_packet = new DatagramPacket(buffer, buffer.length, address, port);
                m_udpService.getServiceSocket().send(m_packet); 
                logger.debug("give login user ip:"+address+"; port:"+port+"send XML");
         }
            } catch (Exception e) {
             e.printStackTrace();
            } finally {
             m_packet = null;
            }
        }
    }
    

    public static void main(String[] args) {
new IMServer(9901).start();
new IMServer(9902).start();
new IMServer(9903).start();
}
}

解决方案 »

  1.   

    jsp不是在浏览器里显示内容么?还要main方法干吗?
      

  2.   

    可以再JSP页面中写JAVA脚本,通过反射机制去调用!
      

  3.   


    <%  Class imServerClass = Class.forName("com.hereim.server.IMServer");

      Method method = imServerClass .getMethod("main", String[].class);

      method.invoke(null, new Object[] {new String[] {}});%>