See [1].

Valid ServerSocket constructors:

ServerSocket()
ServerSocket(int)
ServerSocket(int,int)
ServerSocket(int,int,InetAddress)

Your code is trying:

ServerSocket(int,string)

[1] http://docs.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html


On Tue, Aug 28, 2012 at 8:25 PM, larry google groups <
lawrencecloj...@gmail.com> wrote:

> I apologize about the beginner questions. I am new to Clojure.
>
> If I do this:
>
> (defn run-server [port what-to-do]
>   (let [server-socket (ServerSocket. port "localhost")]
>     (while (not (. server-socket isClosed))
>       (listen-and-respond server-socket what-to-do))))
>
> (defn -main [& args]
>   (let [port (Integer/parseInt (first args))
>         service (symbol (second args))]
>     (println "Server is starting")
>     (println "port: " port)
>     (println  (second args))
>     (println  (symbol (second args)))
>     (println "service: " service)
>     (run-server port service)))
>
> And on the command line I call it like:
>
>  java -jar who-is-logged-in-1.0-standalone.jar 3456 "who-is-here-now"
>
> This prints out:
>
> Server is starting
> port:  3456
> who-is-here-now
> who-is-here-now
> service:  who-is-here-now
>
> but then I get this error:
>
> Exception in thread "main" java.lang.ClassCastException: java.lang.String
> cannot be cast to java.lang.Number
> at who_is_logged_in.core$run_server.invoke(core.clj:27)
>
> Line 27 is:
>
> (defn run-server [port what-to-do]
>
> The only way I can read the error message is to think that the code is
> trying to assign the value of what-to-do to the (integer) "port".
>
> What have I done wrong?
>
>
>
>
> On Tuesday, August 28, 2012 12:47:44 PM UTC-4, larry google groups wrote:
>>
>> >Command line arguments that are not strings need to be converted
>> > prior to use by your main function.
>>
>> That makes sense, I need to cast it to a symbol, yes? I have a problem
>> with that though. At the REPL I tried something like this:
>>
>> (def hey (resolve (symbol what-to-do)))
>>
>> which worked great at the REPL, but in my code I get "nil" returned from
>> resolve. If I do this:
>>
>> (defn -main [& args]
>>   (let [port (Integer/parseInt (first args))
>>         service (resolve (symbol (second args)))]
>>     (println "Server is starting")
>>     (println "port: " port)
>>     (println  (second args))
>>     (println  (symbol (second args)))
>>     (println "service: " service)
>>     (run-server port service)))
>>
>> And call it like this:
>>
>> java -jar who-is-logged-in-1.0.0-**SNAPSHOT-standalone.jar 3456
>> "who-is-here-now"
>>
>> Everything looks correct till the final line when I get "nil":
>>
>> Server is starting
>> port:  3456
>> who-is-here-now
>> who-is-here-now
>> service:  nil
>>
>>
>>
>>
>>
>>
>>
>>
>> On Tuesday, August 28, 2012 6:53:24 AM UTC-4, Jon_Boone wrote:
>>>
>>> Command line arguments that are not strings need to be converted prior
>>> to use by your main function.
>>>
>>> Look at the code for the port number and do the same for the service.
>>>
>>> --jon
>>>
>>>
>>> On Aug 28, 2012, at 2:42, larry google groups <lawrenc...@gmail.com>
>>> wrote:
>>>
>>>
>>> So, this started when I read Keith Swallow's article on a simple web
>>> server:
>>>
>>> http://keithcelt.com/a-simple-**web-server-in-clojure<http://keithcelt.com/a-simple-web-server-in-clojure>
>>>
>>> I took his code and ran "lein new" to create a new project and I copy
>>> and pasted his code to core.clj and made some minor adjustments, adding
>>> gen-class and main so I could run this from the command line. My main
>>> function looked like this:
>>>
>>> (defn -main [& args]
>>>   (let [port (Integer/parseInt (first args))]
>>>     (println "Server is starting")
>>>     (run-server port echo)))
>>>
>>> Which called his function:
>>>
>>> (defn run-server [port service]
>>>   (let [server-socket (create-socket port)]
>>>     (while (not (. server-socket isClosed))
>>>
>>>       (listen-and-respond server-socket service))))
>>>
>>> I compiled that and ran "lein uberjar" and then ran it from the command
>>> line and it worked great.
>>>
>>> Then, to make it slightly more flexible, I wanted to hand in the name of
>>> the service from the command line. So I made a minor change:
>>>
>>>
>>> (defn run-server [port what-to-do]
>>>   (let [server-socket (ServerSocket. "localhost" port)]
>>>     (while (not (. server-socket isClosed))
>>>       (listen-and-respond server-socket what-to-do))))
>>>
>>> (defn -main [& args]
>>>   (let [port (Integer/parseInt (first args))
>>>         service (second args)]
>>>     (println "Server is starting")
>>>     (println "port: " port)
>>>     (println "service: " service)
>>>     (run-server port service)))
>>>
>>> I compiled this and ran it. And now this line:
>>>
>>> (defn run-server [port what-to-do]
>>>
>>> Gets this error:
>>>
>>> Exception in thread "main" java.lang.ClassCastException:
>>> java.lang.String cannot be cast to java.lang.Number
>>> at who_is_logged_in.core$run_**server.invoke(core.clj:27)
>>>
>>> I'm calling it from the command line with:
>>>
>>> java -jar who-is-logged-in-1.0.0-**SNAPSHOT-standalone.jar 3456
>>> who-is-here-now
>>>
>>> I also tried putting the service name in quotes:
>>>
>>> java -jar who-is-logged-in-1.0.0-**SNAPSHOT-standalone.jar 3456
>>> "who-is-here-now"
>>>
>>> Can anyone tell me what is wrong? Why does Clojure think I'm trying to
>>> cast "who-is-here-now" to a number?
>>>
>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>
>>>  --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to