如题:例如80端口。
默认情况下80端口是HTTP协议,我想对此端口进行监听,看对方发送什么请求。如果是我想要的请求,那么就做一些操作。
此变态要求完全是因为我买的主机不支持自己开设端口,否则我就用socket了,请知道的大侠帮帮忙,小弟不胜感激!!说个思路也可以!!!

解决方案 »

  1.   

    80端口也可以用Socket,只不过你要自己实现HTTP协议,也就是说,你收到了请求后,要根据HTTP协议的规范来解析你收到的消息包。
      

  2.   

    只要这个端口没被占用,你监听哪个都是一样的...发送给80端口的请求也不一定就是HTTP,取决于客户端的请求了
      

  3.   

    80端口已经被设置成为接受HTTP请求的端口了,那么我如何监听已经被使用的端口?
      

  4.   

    80端口特殊,是因为它是http的默认端口。
    如果你机器上没有运行web服务器,或者其他监听80端口的服务,那么它就是一个普通的端口。你可以像监听普通端口一样监听它。
    但是如果它已经被使用了,那你就不能监听它了。
      

  5.   

    ///////ServerSocketService.javapublic class ServerSocketService extends Thread {
         //运行状态
        volatile boolean           running;
        ServerSocket               server;
         //监听端口
        int                        serverPort;
        //最大连接数
        int                        backlog;    static ServerSocketService instance;    ServerSocketService () {
            super();
        }    public static ServerSocketService getInstance() {
            if (null == instance) {
                init();
            }        return instance;
        }    private synchronized static void init() {
            instance = new ServerSocketService();     
            instance.serverPort = new Integer(OAMConfig.getItemValue("Alert","omcAlertAcceptPort")).intValue();
            instance.start();
        }    public void destroy() {
            if (server != null) {
                try {
                    server.close();
                } catch (IOException e) {
                    TraceService.trace(LogConstants.ALERT,
                            this.getClass().getName() + "I/O流出现异常" +
                            e.toString());
                }
            }
            running = false;
            interrupt();
        }    public void run() {
            if (running) {
                return;
            }        running = true;
            try {
                while (running) {
                    server = new ServerSocket(serverPort);
                    try {
                        Socket accept = null;
                        while (true) {
                            // 以线程方式处理请求
                            accept = server.accept();
                            TraceService.trace(LogConstants.ALERT,this.getClass().getName()+
                                    new StringBuffer("接受来自").append(
                                            accept.getInetAddress().getHostName())
                                            .append(':').append(accept.getPort())
                                            .append("连接").toString());
                            new Thread(new ServerSocketHandler(accept)).start();
                        }
                    } catch (Exception e) {
                        TraceService.trace(LogConstants.ALERT,this.getClass().getName() +
                               "接收ServerSocketHandler对象出现异常: " + e.toString());
                    }
                }
            } catch (IOException e) {
                TraceService.trace(LogConstants.ALERT,this.getClass().getName() +
                        "create server socket failed !" + e.toString());
            } finally {
                running = false;
            }
        }
        /**
         * @return the backlog
         */
        public int getBacklog() {
            return backlog;
        }
        /**
         * @return the serverPort
         */
        public int getServerPort() {
            return serverPort;
        }}/////////调用下面的ServerSocketHandler.javapublic class ServerSocketHandler implements Runnable {
        Socket         socket;
        boolean        close;
        final Calendar aliveTime = Calendar.getInstance();
        public ServerSocketHandler (Socket socket) {
            this.socket = socket;
        }    /*
         * (non-Javadoc)
         *
         * @see java.lang.Runnable#run()
         */
        public void run() {
            while (true) {
                try {
                    if (socket != null && socket.isConnected()) {
                        synchronized (socket) {
                            handlerMessage();
                        }
                    } else {
                        close = true;
                    }
                } catch (IOException e) {
                    TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "I/O异常:"+
                             e.toString());
                }
                if (isAlive()) {
                    // 如果socket无效,关闭socket终止线程
                    close();
                    break;
                }
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "休眠异常:" +
                            e.toString());
                }
            }
        }    /**
         * 判断socket是否有效
         */
        private boolean isAlive() {        boolean result = false;
            if (close) {
                // 需要关闭或端口发生改变
                result = true;
            } else if (aliveTime.before(Calendar.getInstance())) {
                // 有效时间在当前时间之前
                result = true;
            }
            return result;
        }
        /**
         * 从套接字中读取消息,并响应
         *
         * @throws IOException
         */
        private void handlerMessage() throws IOException {
            BufferedInputStream is = null;
            is = (BufferedInputStream)socket.getInputStream();
           //这个为我自己的类,用来接收流信息
            KernelReport4Alert msg = new KernelReport4Alert();
            msg.doTask(is);
        }    /**
         * 关闭socket连接
         */
        private void close() {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    TraceService.trace(LogConstants.ALERT,this.getClass().getName() + "socket关闭异常:" +
                            e.toString());
                }
            }
            socket = null;
            close = false;
        }
    }
      

  6.   

    还有一个办法,就是使用jpcap,java的截包工具。可以截取主机上某个端口的数据包。我的毕业设计就是在主机上安装邮件服务器,然后监听截取25端口数据并解析,提取有用数据。
      

  7.   

    不能java取代jpcap实现吗? 还有自己实现http 可以实现吗?要怎么做,谢谢指点下