我对两件事感到困惑。一,错误信息本身。第二,这段代码启动了这么多线程。我以为它会启动 2 或 3 个线程来响应单个请求,但是当我在 localhost 上运行它并将我的浏览器指向它(仅一次)时,它会启动 40 个线程。诚然,我使用的是 Chrome,它在后台发送 3 个请求,出于各种复杂的原因,谷歌将其辩护为“功能”(速度)。
这个错误是什么意思?
Exception in thread "Thread-39" java.lang.IllegalArgumentException: Key must be integer
at clojure.lang.APersistentVector.invoke(APersistentVector.java:250)
at serve_pages_from_memory.core$listen_and_respond$fn__51.invoke(core.clj:30)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Thread.java:680)
我看到以前在 StackOverflow 上讨论过类似的错误,但我看不出它们与我的问题有什么关系:
我正在尝试构建一个提供页面的简单应用程序。我这样做主要是为了测试我自己对 Clojure 的了解。这是大部分代码:
(defn start-thread [f]
(doto (new Thread f) (.start)))
(defn serve-page [wrt]
(let [content-length (count page-string)]
(. wrt println "HTTP/1.1 200 OK")
(. wrt println "Content-Type: text/html; charset=UTF-8")
(. wrt println "Connection: Keep-Alive")
(. wrt println (str "Content-Length: " content-length))
(. wrt print "\r\n")
(. wrt print page-string)
(. wrt flush)
(. wrt close)))
(defn listen-and-respond [ss]
(let [client (. ss accept)]
(start-thread #([client]
(let [wrt (new PrintWriter (new BufferedWriter (new OutputStreamWriter (. client (getOutputStream)))))]
(serve-page wrt))))))
(defn create-server [port]
(let [ss (new ServerSocket port)]
(start-thread #(when-not (. ss (isClosed))
(try (listen-and-respond ss)
(catch SocketException e))
(recur)))
ss))
(defn -main [& args]
(println "Server is starting")
(let [port (Integer/parseInt (first args))]
(create-server port)))
该错误似乎在抱怨这一行:
(serve-page wrt))))))
但那是一个函数名和一个 PrintWriter 对象。错误消息表明这是关于带有键的地图。该错误没有任何意义。
有什么建议么?