Comment implémenter le serveur echo de connexions 10k dans Clojure? Clojure.contrib.server-socket n'est pas la solution car il crée un nouveau thread pour chaque connexion.Programmation du serveur avec Clojure
Répondre
Ce qui est génial avec Clojure, c'est que vous avez toutes ces excellentes bibliothèques pour la JVM comme netty, qui sont hautement optimisées, configurables et bien pensées. Quelque chose comme ça devrait vous aider à démarrer:
(ns netty
(:gen-class)
(:import
[java.net InetSocketAddress]
[java.util.concurrent Executors]
[org.jboss.netty.bootstrap ServerBootstrap]
[org.jboss.netty.channel Channels ChannelPipelineFactory
SimpleChannelHandler]
[org.jboss.netty.channel.socket.nio NioServerSocketChannelFactory]
[org.jboss.netty.buffer ChannelBuffers]))
(declare make-handler)
(defn start
"Start a Netty server. Returns the pipeline."
[port handler]
(let [channel-factory (NioServerSocketChannelFactory.
(Executors/newCachedThreadPool)
(Executors/newCachedThreadPool))
bootstrap (ServerBootstrap. channel-factory)
pipeline (.getPipeline bootstrap)]
(.addLast pipeline "handler" (make-handler))
(.setOption bootstrap "child.tcpNoDelay", true)
(.setOption bootstrap "child.keepAlive", true)
(.bind bootstrap (InetSocketAddress. port))
pipeline))
(defn make-handler
"Returns a Netty handler."
[]
(proxy [SimpleChannelHandler] []
(channelConnected [ctx e]
(let [c (.getChannel e)]
(println "Connected:" c)))
(channelDisconnected [ctx e]
(let [c (.getChannel e)]
(println "Disconnected:" c)))
(messageReceived [ctx e]
(let [c (.getChannel e)
cb (.getMessage e)
msg (.toString cb "UTF-8")]
(println "Message:" msg "from" c)))
(exceptionCaught
[ctx e]
(let [throwable (.getCause e)]
(println "@exceptionCaught" throwable))
(-> e .getChannel .close))))
Merci! J'ai mis un projet de leiningen simple pour ceci ici: https://github.com/cymen/clojure-netty – Cymen
Comment envoyer un message à ce serveur? – vemv
@vemv J'ai mis à jour le repo pour utiliser le projet github pour utiliser un netty public et ajouté un exemple de la façon d'envoyer un message au serveur. – Cymen
- 1. écrire un serveur de multiplexage dans clojure?
- 2. Programmation du socket serveur client en Python
- 3. Programmation de serveur HTTP
- 4. Comment arrêter le serveur jetty dans clojure?
- 5. Variables Clojure avec métadonnées
- 6. Programmation Client serveur en Java
- 7. Clojure Box: Problème avec classpath (question Noob)
- 8. Plusieurs instances du contrôle serveur attachées par programmation n'apparaissent pas?
- 9. Vérification md5sum par programmation avec php sur le serveur
- 10. Programmation client/serveur de base
- 11. Charger xml avec clojure avec XStream
- 12. Interaction avec programmation avec gdbserver
- 13. Fonction du mode idiomatique dans Clojure
- 14. programmation du port série
- 15. Windows Programmation du système
- 16. Paramètre passant avec bash pour clojure
- 17. Problème de performance avec Clojure Array
- 18. problème clojure rmi classpath
- 19. programmation du répertoire actif
- 20. Programmation Positionnement du moniteur
- 21. Programmation du noyau d'apprentissage
- 22. Programmation dynamique avec Data.Vector
- 23. Type Clojure laisse deviner la syntaxe
- 24. Programmation de socket avec J2ME
- 25. Apprentissage du serveur client C#
- 26. StringIO de Python pour Clojure
- 27. À quel point la programmation de Clojure fonctionne-t-elle sur le Kindle?
- 28. évaluation Clojure sans SLIME
- 29. Interaction avec les tâches du serveur Sql par programme
- 30. Clojure macroexpand
Faites-vous référence au problème c10k? http://www.kegel.com/c10k.html –
Je l'ai lu, oui, et je suis curieux de savoir comment il serait mis en œuvre dans cette langue intéressante. Notez que clojure annonce beaucoup ses capacités de concurrence. – Roskoto