首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java简单服务器错误

Java简单服务器错误
EN

Stack Overflow用户
提问于 2012-02-12 15:46:10
回答 4查看 838关注 0票数 0

几个小时前,我已经开始学习java套接字通信。现在,我正在尝试使服务器应用程序惠奇应该将我的数据返回到Now浏览器。我的代码:

代码语言:javascript
复制
try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    OutputStream str = response.getOutputStream();
    str.write(lol.getBytes("US-ASCII"));
    str.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException ex)
    {
        System.out.println(ex.toString());
    }
}

我在服务器应用程序中没有错误,消息"LOL工作!“在控制台中打印,但在webbrowser中,我得到了以下错误:

阳极知道如何修复它并在网页浏览器中获取文本"hi“吗?谢谢。

编辑:,我尝试过将它添加到telnet中。其结果是:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-12 15:49:56

您不能只向浏览器发送原始数据并期望它处理它--您必须遵循RFC1945中描述的HTTP (协议)。

具体来说,您必须发送几个标头,然后是一个新行,如RFC1945第4.1节所述。

代码语言:javascript
复制
try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    writer = new PrintStream(response.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException e)
    {
        e.printStackTrace();
    }
}

请注意,我还将您的OutputStream封装在一个PrintStream中,因为这比手动处理OutputStream要容易得多。

票数 2
EN

Stack Overflow用户

发布于 2012-02-12 17:51:15

除了没有像克里斯蒂安·安东森()指出的那样,发送适当的回复之外,问题很可能是,在你回复之前,你实际上并不等待和阅读请求。可以说,这不应该是一个问题,因为缓冲,但即使这样,你的服务器很可能只是“太快”,发送响应和关闭插座之前,Chrome有机会发送请求,从而触发“连接重置”问题,它报告。

尝试实现一个稍微完整一点的服务器。下面是一个简单的例子:

代码语言:javascript
复制
public void readRequest(Socket client) throws IOException {
    Reader raw = new InputStreamReader(client.getInputStream(), "US-ASCII");
    BufferedReader reader = new BufferedReader(raw);
    while(true) {
        String line = reader.readLine().trim();
        if(line.equals(""))
            break;
    }
}

public void writeResponse(Socket client) throws IOException {
    String lol = "<html>hi</html>";
    PrintStream writer = new PrintStream(client.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
}

public void serveClient(Socket client) throws IOException {
    try {
        readRequest(client);
        writeResponse(client);
        System.out.println("LOL works!");
    } finally {
        client.close()
    }
}

public void serve() {
    try{
        ServerSocket socket = new ServerSocket(80);
        while(true) {
            Socket client = socket.accept();
            serveClient(client);
        }
    }catch(IOException e) {
        e.printStackTrace();
    }
}

(请注意,我没有尝试代码或其他任何东西,因此不能保证它按原样编译。)

票数 2
EN

Stack Overflow用户

发布于 2012-02-12 15:50:26

web浏览器使用HTTP协议与web服务器通信。如果希望浏览器正确显示页面,则服务器必须根据此协议响应浏览器的请求。

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

https://stackoverflow.com/questions/9250097

复制
相关文章

相似问题

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