首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java编程=>只适用于IE9吗?

Java编程=>只适用于IE9吗?
EN

Stack Overflow用户
提问于 2013-02-26 10:02:20
回答 2查看 275关注 0票数 0

当浏览器试图连接到本地主机时,我正在创建一个多线程服务器程序来显示浏览器的请求。

我发现只有IE9在我的视窗工作正常,但没有火狐19,Chrome,Opera。他们只是坐在那里等待我的节目响应。

我错过了什么?

代码语言:javascript
复制
import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HTTPEchoServer {

    private static final String serverName = "HTTPEchoServer";
    private static final int port = 80;
    private static final String CRLF = "\r\n";
    private static final Logger logger = Logger.getLogger(serverName);

    private static void printHeader(PrintWriter out) {
        out.println("HTTP/1.0 200 OK\r\n" + "Server: " + serverName + CRLF
                + "Content-Type: text/html" + CRLF + CRLF
                + "<!DOCTYPE HTML PUBLIC "
                + "\"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
                + "<HTML>\n"
                + "<HEAD>\n"
                + " <TITLE>" + "HTTP Echo Server Result</TITLE>\n"
                + "</HEAD>\n"
                + "<H1>HTML Received from HTTP Echo Server</H1>\n"
                + "<B>Here is the request sent by your browser:</B>\n"
                + "<PRE>");
    }

    private static void printTrailer(PrintWriter out) {
        out.println("</PRE>\n" + "</BODY>\n" + "</HTML>\n");
    }

    static class ClientHandler extends Thread {

        Socket socket = null;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {

            logger.log(Level.INFO, "Accepted client {0}:{1}", 
                  new Object[]{socket.getInetAddress(), socket.getPort()});
            try {

                InputStream is = socket.getInputStream();
                OutputStream os = socket.getOutputStream();
                try (PrintWriter writer = new PrintWriter(os, true)) {
                    synchronized (this) {
                        printHeader(writer);
                        writer.flush();
                        BufferedReader reader = new BufferedReader 
                             (new InputStreamReader(is));
                        String line;
                        while ((line = reader.readLine()) != null) {
                            writer.println(line);
                            writer.flush();
                        }
                        printTrailer(writer);
                        writer.flush();
                        writer.close();
                    }
                }
                socket.close();
            } catch (IOException ex) {
                logger.log(Level.SEVERE, null, ex);
            }
            logger.log(Level.INFO, "Disconnected client {0}:{1}",
new Object[]{socket.getInetAddress(), socket.getPort()});
        }
    }

    public static void main(String[] args) {    

        try {
            ServerSocket server = new ServerSocket(port);
            logger.log(Level.INFO, "Server started, listening at port {0} ...", port);
            ExecutorService executor = Executors.newCachedThreadPool();
            while (true) {
                Socket socket = server.accept();
                ClientHandler handler = new ClientHandler(socket);
                executor.execute(handler);
            }
        } catch (IOException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }
}    

还发现,除非我将端口更改为8080,否则我无法在OS上运行这个程序。我已经禁用了我的OSX10.8.2电脑上的防火墙。我得到的错误是:

代码语言:javascript
复制
<pre>
java.net.BindException: Permission denied
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
    at java.net.ServerSocket.bind(ServerSocket.java:376)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at HTTPEcho.HTTPEchoServer.main(HTTPEchoServer.java:80)
</pre>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-26 10:11:25

正如例外本身所说的那样,java.net.BindException: Permission denied。您需要成为root用户才能绑定1024下面的端口。如果您在linux上,那么您可以做sudo java HTTPEchoServer来启动服务器。

其他可能是您已经在端口80上运行了一台服务器。

票数 0
EN

Stack Overflow用户

发布于 2013-02-26 10:10:42

除了MSIE之外,您不能在所有浏览器中打开applet中的服务器套接字。这是因为打开服务器套接字是违反安全的。如果你真的想这样做,你必须在你的小程序上签名。

我希望正确理解您的代码在applet环境中运行(因为您提到了浏览器),尽管我无法从从main()开始的堆栈跟踪中看到这个方面。

编辑:我又读了你的帖子,我明白你的问题实际上包含两个问题:第一个是关于小程序,第二个是关于在Unix下作为应用程序运行。对于unix @AndersR.Bystrup,给出了答案:只有root才能侦听1024以下的端口。因此,您必须以root用户身份或使用sudo运行您的程序。

顺便说一句,你好像走错路了。你能解释一下你想要实现什么吗?社区也许可以给你一个更好的解决方案的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15086157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档