【问题标题】:How to set Java HTTP Server context handler threaded safe?如何设置 Java HTTP Server 上下文处理程序线程安全?
【发布时间】:2021-04-21 06:12:07
【问题描述】:

我正在尝试用 Java 制作自己的 http 服务器。
该应用程序的目的是将 RequestBody 获取为 json。
将键和值分别解析为字符串。

使用下面的代码运行应用程序以及当我使用 curl 进行测试时。
我得到这个错误。你有什么想法吗?

curl http://127.0.0.1:33334 -d @test.json --header "Content-Type: application/json"
curl: (18) 传输关闭,剩余 32 个字节要读取

Main.java

package com.server.entry.http;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.server.functions.Init;
import com.server.models.ProgramArgument;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import org.apache.log4j.Logger;

import java.io.*;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.concurrent.Executors;


public class Main {
    static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {
        Init init = new Init();
        ProgramArgument programArgument = new ProgramArgument();
        init.sortArg(programArgument, args);
        Properties p = init.readProperties(programArgument.getPropertiesPath());
        init.configruProperties(p.getProperty("logPath"));

        String hostName = p.getProperty("hostName");
        int port = Integer.parseInt(p.getProperty("port"));

        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(hostName,port), 10);
            server.createContext("/", MyHandler.getInstance());
            server.setExecutor(Executors.newCachedThreadPool());
            server.start();
        } catch (Exception e) {
            logger.error("{}", e);
        }
    }

    static class MyHandler implements HttpHandler {
        private MyHandler() {}
        public static MyHandler getInstance() {
            return LazyHolder.INSTANCE;
        }

        private static class LazyHolder {
            private static final MyHandler INSTANCE = new MyHandler();
        }
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> jsonMap = mapper.readValue(t.getRequestBody(), Map.class);
            Iterator<String> itr = jsonMap.keySet().iterator();

            StringJoiner keyJoiner = new StringJoiner(",", "", "");
            StringJoiner valueJoiner = new StringJoiner("','", "'", "'");
            while(itr.hasNext())
            {
                String key = itr.next();
                keyJoiner.add(key);
                valueJoiner.add((String)jsonMap.get(key));
            }
            System.out.println(keyJoiner.toString());
            System.out.println(keyJoiner.toString());

            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

test.json

{
  "name": "dddddddddd",
  "email": "dddd@ddd.com",
  "age": 25
}

我想得到这样的结果。

键:姓名,电子邮件,年龄,值:'dddddddddd','dddd@ddd.com','25'

谢谢你们。

【问题讨论】:

    标签: java multithreading http thread-safety httpserver


    【解决方案1】:

    你在哪里调用你的 curl 命令?如果它是 bash 终端,它必须从带有您的 @test.json 的文件夹运行,或者您应该更改文件路径。当我使用参数-d @test.json 调用 curl 和从不同目录运行的 bash 终端时,我重现了您的问题。发生此响应是因为您的 inputStream 为空。 当路径和文件目录正确时,我有一个肯定的响应。

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多