TCP一点东东

本文介绍了一个基于Java的TCP服务器实现,包括服务器处理类(ServerHandler)和TCP服务器(TCPServer)的具体设计与编码细节。
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 ( 0 ,  4 )))
        {
             //  如果消息不合法
             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);
    }

}

转载于:https://www.cnblogs.com/chendong/archive/2012/12/03/2799987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值