Существует много способов сделать ориентированную на многопотоковое исполнение Singleton* инициализация на окнах. На самом деле некоторые из них являются даже межплатформенными. В ТАК поток, с которым Вы связались, они искали Singleton, которая лениво создается в C, который немного более конкретен, и может быть немного более хитрым, чтобы сделать правильно, учитывая запутанность модели памяти, под которой Вы работаете.
clojure.contrib.server-socket
- ваш друг. Используйте create-server
, например, чтобы создать простой эхо-сервер:
(import '[java.io BufferedReader InputStreamReader OutputStreamWriter])
(use 'clojure.contrib.server-socket)
(defn echo-server []
(letfn [(echo [in out]
(binding [*in* (BufferedReader. (InputStreamReader. in))
*out* (OutputStreamWriter. out)]
(loop []
(let [input (read-line)]
(print input)
(flush))
(recur))))]
(create-server 8080 echo)))
(def my-server (echo-server))
Теперь telnet, чтобы убедиться, что он работает:
$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello // this is the echoed line, woohoo!
Кстати, сервер тоже многопоточный, потому что clojure.contrib .server-socket
создает новый поток при принятии нового соединения.
Если это не соответствует вашим потребностям, тогда Java API - ваш друг. Поскольку у вас есть полный доступ к классам Java из Clojure, вы можете просто использовать сокеты Java, если вам нужно перейти к делу. Я ничего не знаю о вашем прошлом, но, если предположить, что вы раньше не использовали сокеты Java, у Sun есть руководство: http://java.sun.com/docs/books/tutorial/networking/sockets/
Просмотрите clojure.contrib
, чтобы посмотрите, есть ли какие-нибудь библиотеки для управления сокетами. Если нет, то вам остается написать свой собственный, используя классы Java через средства взаимодействия с Java Clojure.
Я написал небольшую многопользовательскую текстовую приключенческую игру под названием Mire , которая демонстрирует это. Это довольно просто.