梦幻之旅

DEBUG - 天道酬勤

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  671 随笔 :: 6 文章 :: 256 评论 :: 0 Trackbacks
package org.upeng.mail.net.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import org.upeng.mail.net.util.AESUtil;
import org.upeng.mail.net.util.NetConfit;
import org.upeng.mail.net.util.NetLoger;
import org.upeng.mail.process.InstructionProcessor;

/**
 * <ul>
 * <li>Title:[服务器处理类]</li>
 * <li>Description: [type of functional description]</li>
 * <li>Copyright 2009 Upengs Co., Ltd.</li>
 * <li>All right reserved.</li>
 * <li>Created by [Huyvanpull] [2011-9-5]</li>
 * <li>Midified by [modifier] [modified time]</li>
 * </ul>
 * 
 * @version 1.0
 
*/

public class ServerHandler implements Runnable
{
    
/** SOCKET */
    private Socket socket;
    
    
/** 缓冲写入 */
    private BufferedWriter bw;
    
    
/** 缓冲读入 */
    private BufferedReader br;
    
    
/** 指令处理缓存 */
    private InstructionProcessor processor;
    
    
/**
     * <ul>
     * <li>Description:[构造方法]</li>
     * <ul>
     * 
     * @param socket
     
*/

    
public ServerHandler(Socket socket)
    {
        this.socket 
= socket;
        processor 
= new InstructionProcessor();
    }
    
    
public void run()
    {
        try
        {
            
// 创建缓冲读写
            br 
= new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));
            bw 
= new BufferedWriter(new OutputStreamWriter(socket
                    .getOutputStream()));
            
            
// 客户端发来的消息
            String msg 
= null;
            
while (true)
            {
                msg 
= readLine();
                
                
// 这里是远程商品,发向远程
                processor.process(getRemoteIp(), msg);
                write(NetConfit.tcp_oparator_success);
            }
            
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            freeSource();
        }
    }
    
    
/**
     * <ul>
     * <li>Description:[写数据]</li>
     * <li>Created by [Huyvanpull] [2011-9-5]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
     * @param msg
     * @throws IOException
     
*/

    private void write(String msg) throws IOException
    {
        
// 判断写入的消息是否合法
        
if (msg == null || "".equals(msg))
        {
            
return;
        }
        
        
// 处理消息,加上部首, 且加密数据,防止非法者抓包
        String encodeMsg 
= NetConfit.tcp_msg_head + msg;
        encodeMsg 
= AESUtil.encrypt(encodeMsg, NetConfit.password);
        
        
// 写数据
        bw.write(encodeMsg);
        bw.newLine();
        bw.flush();
        
        
// 记录日志
        NetLoger.logSnd(getRemoteIp(), socket.getPort(), msg);
    }
    
    
/**
     * <ul>
     * <li>Description:[读数据]</li>
     * <li>Created by [Huyvanpull] [2011-9-5]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
     * @return
     * @throws IOException
     
*/

    private String readLine() throws IOException
    {
        String decodeMsg 
= "";
        
// 读取一行数据,并判断数据是否非法
        String endcodeMsg 
= br.readLine();
        
if (endcodeMsg == null || "".equals(endcodeMsg))
        {
            
return decodeMsg;
        }
        
        
// 解密数据,并判断数据是否是合法的
        decodeMsg 
= AESUtil.decrypt(endcodeMsg, NetConfit.password);
        
        
if (decodeMsg.length() < 5
                
|| !NetConfit.tcp_msg_head.equals(decodeMsg.substring(04)))
        {
            
// 如果消息不合法
            
return "";
        }
        
else
        {
            decodeMsg 
= decodeMsg.substring(4);
        }
        
        
// 写入日志
        NetLoger.logRsv(getRemoteIp(), socket.getPort(), decodeMsg);
        
        
// 返回结果
        
return decodeMsg;
    }
    
    
/**
     * <ul>
     * <li>Description:[得到远程IP]</li>
     * <li>Created by [Huyvanpull] [2011-9-7]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
     * @return
     
*/

    private String getRemoteIp()
    {
        
return socket.getInetAddress().getHostAddress().toString();
    }
    
    
/**
     * <ul>
     * <li>Description:[释放资源]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     
*/

    private void freeSource()
    {
        try
        {
            
// 释放BufferWriter
            
if (bw != null)
            {
                bw.
close();
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        
        try
        {
            
// 释放BufferReader
            
if (br != null)
            {
                br.
close();
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        
        try
        {
            
// 释放Socket
            
if (socket != null)
            {
                socket.
close();
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
2.
package org.upeng.mail.net.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.upeng.mail.net.util.NetConfit;
import org.upeng.mail.net.util.NetLoger;

/**
 * <ul>
 * <li>Title:[TCPServer]</li>
 * <li>Description: [TCP网络服务]</li>
 * <li>Copyright 2009 Upengs Co., Ltd.</li>
 * <li>All right reserved.</li>
 * <li>Created by [Huyvanpull] [2011-9-6]</li>
 * <li>Midified by [modifier] [modified time]</li>
 * </ul>
 * 
 * 
@version 1.0
 
*/

public class TCPServer extends Thread
{
    
/** TCP服务器实例 */
    
private static TCPServer tcpServer = new TCPServer();
    
    
/** server socket */
    
private ServerSocket serverSocket;
    
    
private ExecutorService executorService;
    
    
/** 端口号 */
    
private int port;
    
    
/** 是否启动成功(如端口已经被占用,就不能启动成功) */
    
private boolean isStoped = false;
    
    
/**
     * <ul>
     * <li>Description:[构造方法]</li>
     * <ul>
     
*/

    
private TCPServer()
    
{
        startServer();
    }

    
    
/**
     * <ul>
     * <li>Description:[得到单态的实例]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
     * 
@return
     
*/

    
public static TCPServer getInstance()
    
{
        
return tcpServer;
    }

    
    
/*
     * (non-Javadoc)
     * 
     * @see java.lang.Thread#run()
     
*/

    
public void run()
    
{
        
this.service();
    }

    
    
/**
     * <ul>
     * <li>Description:[服务]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     
*/

    
private void service()
    
{
        
// 测试信息
        StringBuffer debugInfo = new StringBuffer();
        
while (!isStoped)
        
{
            Socket socket 
= null;
            
try
            
{
                
// 等等连接
                socket = serverSocket.accept();
                
                
// 测试信息
                debugInfo.delete(0, debugInfo.length());
                debugInfo.append(
"服务器与");
                debugInfo.append(socket.getRemoteSocketAddress().toString());
                debugInfo.append(
"建立连接");
                NetLoger.log(debugInfo.toString());
                
                
// 服务器处理线程
                executorService.execute(new ServerHandler(socket));
            }

            
catch (SocketTimeoutException stex)
            
{}
            
catch (Exception e)
            
{
                e.printStackTrace();
            }

        }

    }

    
    
/**
     * <ul>
     * <li>Description:[服务器是否启动成功]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
     * 
@return
     
*/

    
public boolean isStopeded()
    
{
        
return isStoped;
    }

    
    
/**
     * <ul>
     * <li>Description:[启动服务器]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     
*/

    
private void startServer()
    
{
        
// 设置端口,是测试模式和正式模式
        this.port = NetConfit.localPort;
        
try
        
{
            serverSocket 
= new ServerSocket(port);
            serverSocket.setSoTimeout(
30000);
            executorService 
= Executors.newCachedThreadPool();
            NetLoger.log(
"TCP服务器启动成功.");
            
this.start();
        }

        
catch (Exception ex)
        
{
            isStoped 
= true;
            NetLoger.log(
"TCP服务器启动失败.");
            ex.printStackTrace();
        }

    }

    
    
/**
     * <ul>
     * <li>Description:[关闭服务器]</li>
     * <li>Created by [Huyvanpull] [2011-9-6]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     
*/

    @SuppressWarnings(
"deprecation")
    
public void shutDown()
    
{
        
try
        
{
            
this.executorService.shutdown();
            
this.executorService.shutdownNow();
            
this.isStoped = true;
            serverSocket.close();
        }

        
catch (Exception ex)
        
{
            ex.printStackTrace();
        }

        NetLoger.log(
"关闭socket服务器");
    }

    
    
public static void main(String[] args) throws IOException
    
{
        TCPServer.getInstance();
        System.out.println(TCPServer.getInstance().isStoped);
    }

}

posted on 2011-10-22 00:51 HUIKK 阅读(381) 评论(0)  编辑  收藏 所属分类: java Net

只有注册用户登录后才能发表评论。


网站导航: