使用java的小型http服务器?

2024-02-04

我使用 java 创建了以下测试服务器:

   import java.io.*;
import java.net.*;

class tcpServer{
    public static void main(String args[]){
        ServerSocket s = null;
        try{
            s = new ServerSocket(7896);
            //right now the stream is open.
            while(true){
                Socket clientSocket = s.accept();
                Connection c = new Connection(clientSocket);
                //now the connection is established
            }
        }catch(IOException e){
            System.out.println("Unable to read: " + e.getMessage());
        }
    }
}
class Connection extends Thread{
    Socket clientSocket;
    BufferedReader din;
    OutputStreamWriter outWriter;

    public Connection(Socket clientSocket){
        try{
            this.clientSocket = clientSocket;
            din = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "ASCII"));
            outWriter = new OutputStreamWriter(clientSocket.getOutputStream());
            this.start();
        }catch(IOException e){
            System.out.println("Connection: " + e.getMessage());
        }   
    }
    public void run(){
        try{
        String line = null;
        while((line = din.readLine())!=null){
            System.out.println("Read" + line);
            if(line.length()==0)    
                break;
        }
        //here write the content type etc details:
        System.out.println("Someone connected: " + clientSocket);
        outWriter.write("HTTP/1.1 200 OK\r\n");
        outWriter.write("Date: Tue, 11 Jan 2011 13:09:20 GMT\r\n");
        outWriter.write("Expires: -1\r\n");
        outWriter.write("Cache-Control: private, max-age=0\r\n");
        outWriter.write("Content-type: text/html\r\n");
        outWriter.write("Server: vinit\r\n");
        outWriter.write("X-XSS-Protection: 1; mode=block\r\n");
        outWriter.write("<html><head><title>Hello</title></head><body>Hello world from my server</body></html>\r\n");
        }catch(EOFException e){
            System.out.println("EOF: " + e.getMessage());
        }
        catch(IOException e){
            System.out.println("IO at run: " + e.getMessage());
        }finally{
            try{
                            outWriter.close();  
                clientSocket.close();
            }catch(IOException e){
                System.out.println("Unable to close the socket");
            }
        }
    }
}

现在我希望该服务器响应我的浏览器。这就是为什么我给出了网址:http://localhost:7896结果我在服务器端收到:

ReadGET / HTTP/1.1
ReadHost: localhost:7896
ReadConnection: keep-alive
ReadCache-Control: max-age=0
ReadAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
ReadUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10
ReadAccept-Encoding: gzip,deflate,sdch
ReadAccept-Language: en-US,en;q=0.8
ReadAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
ReadCookie: test_cookie=test cookie
Read
Someone connected: Socket[addr=/0:0:0:0:0:0:0:1,port=36651,localport=7896]

我的浏览器出现空白屏幕,源代码也空白。在谷歌浏览器中。

那么谁能告诉我我错在哪里。实际上我对这件事很陌生。所以请纠正我。

提前致谢


你几乎肯定不想使用DataOutputStream关于响应 - 和writeUTF当然不会做你想做的事。DataOutputStream基本上是为二进制协议设计的 - 并且writeUTF写入一个长度前缀的 UTF-8 字符串,而 HTTP 只需要以 CRLF 结尾的 ASCII 文本行。

你想将标题写出一次一行- 所以创建一个OutputStreamWriter围绕套接字输出流,然后写入:

writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Date: Tue, 11 Jan 2011 13:09:20 GMT\r\n");

etc.

您可能想编写自己的writeLine方法在末尾写出包含 CRLF 的行(不要使用系统默认的行终止符),以使代码更清晰。

在标题和正文之间添加一个空行,然后您应该处于合理的形状。

编辑:还有两个更改:

首先,您应该阅读客户的请求。例如,改变din to a BufferedReader,并像这样初始化它:

din = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),
                                               "ASCII"));

然后在开始写入输出之前,请像这样读取请求:

String line;
while ((line = din.readLine()) != null) {
    System.out.println("Read " + line);
    if (line.length() == 0) {
        break;
    }
}

编辑:如评论中所述,这不适合完整的 HTTP 服务器,因为它不能很好地处理二进制 PUT/POST 数据(它可能会将数据读入其缓冲区,这意味着您无法将其读取为来自流的二进制数据)。不过对于测试应用程序来说这很好。

最后,您还应该关闭输出写入器或至少刷新它 - 否则它可能会缓冲数据。

进行这些更改后,您的代码对我有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用java的小型http服务器? 的相关文章

  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • Ant 中回显目标描述

  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo
  • Hazelcast:连接到远程集群

    我们有一组 Hazelcast 节点 全部运行在一个远程系统 具有许多节点的单个物理系统 上 我们希望从外部客户端连接到该集群 一个 Java 应用程序 它使用如下代码连接到 Hazelcast ClientConfig clientCon
  • JPA 的 Hibernate 查询提示

    我一直在尝试为所有可以通过设置的提示找到一个明确的资源Query setHint String Object JPA 中的方法调用 但我一无所获 有人知道一个好的参考吗 See 3 4 1 7 查询提示 http docs jboss or
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 一个类中有多个具有相同参数类型的方法

    我知道 至少已经有了关于这个主题的一个问题 https stackoverflow com questions 5561436 can two java methods have same name with different retur
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • AES 密钥是随机的吗?

    AES 密钥可以通过此代码生成 KeyGenerator kgen KeyGenerator getInstance AES kgen init 128 but 如果我有一个 非常可靠 的生成随机数的方法 我可以这样使用它吗 SecureR
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • Symfony Restful 帖子:JMSSerializerBundle 与 Symfony 表单组件

    据我了解 当控制器收到 post put patch 请求时 JMSSerializerBundle 的反序列化与 symfony 表单组件的反序列 化效果相同吗 因此 我要么创建一个 symfony 自定义 formType 例如一个 U
  • Qt GUI事件记录和回放

    我正在尝试实现一个简单 轻量级的系统来记录 Qt GUI 事件并从脚本中回放它们 我认为使用 Qt 事件系统的魔力这将是相当简单的 但我遇到了一个我不明白的问题 这是我正在做的事情的快速总结 记录 I use QApplication in
  • Perl 的首选单元测试框架是什么?

    我对 Perl 有点陌生 我想知道是否有首选的单元测试框架 谷歌向我展示了一些不错的结果 但由于我是新手 我不知道社区内是否有明确的偏好 Perl 附带了一整套很棒的测试工具 Perl 核心有数以万计的自动检查 并且大部分都使用这些标准 P
  • ActiveRecord::Base 上的 alias_method 导致 NameError

    我有一个直接继承自的模型ActiveResource Base 我正在尝试运行alias method对于记录表中的大多数列 但结果是 NameError 名称错误 未定义的方法address line 1 for class LeadIm
  • 如何使用 CSharp SQLite 加速 SQL 查询?

    背景 我有一个 SQLite3 数据库并且正在使用CSharp SQLite http code google com p csharp sqlite 来查询数据 我的问题是任何使用 JOIN 或 ORDER BY 调用的查询都非常慢 使用
  • JavaScript 中的instanceof 是如何工作的?

    在以下代码示例中 最后对 obj2 和 obj3 进行了检查实例化即使构造方式不同并且返回结果也返回 truename属性不同 var Obj1 function this name foo1 Obj1 prototype name foo
  • 将传单地图组合在一起

    我生成了这两个关于地理坐标的随机数据集 例如 每个点代表法国的一家假想餐厅 id 1 1000 long 2 2945 rnorm 1000 0 1085246 0 1 lat 48 8584 rnorm 1000 0 009036273
  • 3D 迷宫中的最短路径

    我正在尝试编写一个程序来使用递归查找 3D 迷宫中的最短路径 我能够编写找到穿过迷宫的随机路径的代码 但我想知道如何修改我的代码以找到最短路径 请注意 我想保留递归方法 有人可以提出解决方案吗 这是一个二维迷宫示例 s XXXX XX X
  • MVC 4 客户端验证不起作用

    谁能告诉我为什么客户端验证在我的 MVC 4 应用程序中不起作用 layout cshtml Scripts Render bundles jquery RenderSection scripts required false 在我的 we
  • 使用 Flex 和 Bison 的简单 Java 语法

    我最近开始学习基本的 Flex 和 Bison 因为我必须为简单 但不是太简单 语法制作一个解析器 我决定在我的语法中制作一种简化的 Java 语言 我做了 l和 y文件和所有内容都编译没有错误 我正在使用 gcc 进行编译 问题是每次我运
  • 查找一个文件中不存在于另一个文件中的行[重复]

    这个问题在这里已经有答案了 我有两个文件 假设a txt and b txt 两者都有一个名称列表 我已经跑了sort在这两个文件上 现在我想找到来自a txt哪些不存在于b txt 我花了很多时间寻找这个问题的答案 所以记录下来以供将来参
  • 使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式

    我发现零碎的指令here https stackoverflow com questions 11918820 java play 2 deployment以及其他一些关于在 amazon ec2 上部署 Play2 应用程序的地方 但没有
  • 为什么以及如何在 React 组件中使用类名实用程序?

    您能简单地向我解释一下使用的目的是什么吗类名 https github com JedWatson classnamesReact 代码中的实用程序 我刚刚阅读了 Classnames 文档 但我仍然无法理解在代码中使用它的主要原因是什么
  • 我可以在 C++ 项目中混合使用 c 和 cpp 文件吗?

    我有一个项目 其中混合了 c 文件和 cpp 文件 链接器向我抛出错误 undefined reference to
  • 如何在C#中嵌入VBS并运行它?

    我有一个运行良好的 VBScript 我有一个 C 程序 可以使用 cscript 程序运行 VBScript 我想要做的是将 VBS 嵌入到 C exe 中 这样它就是一个文件 并且能够运行 VBS 文件 有什么方法可以将嵌入式 VBSc
  • Android 无法实例化应用程序 java.lang.ClassNotFoundException:

    我正在开发 Android 市场上托管的应用程序 有时 每月一次 我收到一份崩溃报告 无法实例化应用程序 java lang ClassNotFoundException 应用程序下载量在 10 000 50 000 之间 我不知道为什么在
  • 如何将图像添加到 JFrame 标题栏?

    我想添加一个图像 小图标 到javax swing JFrame标题栏 我该怎么做 Since JPanel没有标题栏 我假设您指的是JFrame 话虽如此 使用setIconImage http download oracle com j
  • C++11 std 相当于 Boost has_dereference

    Boost 的许多 SFINAE 助手已经随 C 11 一起出现在 std 库中 但是has dereference似乎没有 除了这个功能之外 我已经设法从我的包中消除了 Boost 依赖项 并且我想完全摆脱它 那么如何最好地仅使用 C 1
  • XML 转换和换行符

    好的 我有适用于此 xml 的代码
  • 使用java的小型http服务器?

    我使用 java 创建了以下测试服务器 import java io import java net class tcpServer public static void main String args ServerSocket s nu