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();
}
}
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();
}
}
<% Class imServerClass = Class.forName("com.hereim.server.IMServer");
Method method = imServerClass .getMethod("main", String[].class);
method.invoke(null, new Object[] {new String[] {}});%>