如题

解决方案 »

  1.   


    import java.io.IOException;
    import java.net.Socket;
    import java.net.ServerSocket;
    import com.omn.xmpp.server.util.Logger;
    public class SocketAcceptThread extends Thread{    /**
         * 默认的监听端口
         */
        public static final int DEFAULT_PORT = 5222;
        /**
         * 代表监听端口
         */
        private int serverPort;
        /**
         * true表示线程没有停止,继续运行
         */
        private boolean notTerminated=true;
        /**
         *记录对象
         */
        private Logger log;
        /**
         * 监听服务
         */
        private ServerSocket serverSocket;
        public SocketAcceptThread(Logger l,int port){
    init(l,port);
        }
        public SocketAcceptThread(Logger l){
         init(l,SocketAcceptThread.DEFAULT_PORT);
        }
        /**
         * 初始化
         * @param l
         * @param port
         */
        public void init(Logger l,int port){
         this.log=l;
         this.serverPort=port;
         try {
    this.serverSocket=new ServerSocket(serverPort);
    } catch (IOException e) {
    log.fatalError("SocketAcceptThread:serversocket初始化失败!!");
    }
        }
        /**
         * 运行端口监听 一旦监听到进一步处理后继续去监听
         */
        public void run() {
            try {
         while (notTerminated) {
     
                    Socket sock = serverSocket.accept();
                    if (sock != null) {
                        //这里添加处理
                        try{
                         System.out.println("SocketAcceptThread:创建了一个connection");
                      new Connection(sock);//创建了connection
                       
                        }catch(IOException e){
                         log.error("SocketAcceptThread:建立连接错误"+e.getMessage());
                        }
                    }
                }        }
            catch (IOException ie) {
                if (notTerminated) {
                    log.error("SocketAcceptThread:socket建立错误"+ie.getMessage());
                }
            }
            catch (Exception e) {
                log.error("SocketAcceptThread:socket监听错误"+e.getStackTrace());
            }
            try {//无论如何也要关闭
                ServerSocket sSock = serverSocket;
                serverSocket = null;
                if (sSock != null) {
                    sSock.close();
                }
            }
            catch (IOException e) {
                // 关闭不上就不管了
            }
        }
        /**
         * 关闭监听.
         */
        public void shutdown() {
            notTerminated = false;        try {
                ServerSocket sSock = serverSocket;
                serverSocket = null;
                if (sSock != null) {
                    sSock.close();
                }
            }
            catch (IOException e) {
                // 在关闭不了就不管了
            }    }
    }
      

  2.   

    一般都是accept后启动一个线程去处理,该线程中的处理大致如下短连接:
    run(){
      read     //读取请求包
      process  //处理
      write    //应答处理结果
    }长连接:
    run(){
     while(NotEnd){
       read
       process
       write
      }
    }