I am trying to write a TCP client in Clojure for a networking assignment. 
While everyone else is using C or C#, I elected to use Clojure and Java 
sockets, but am naturally running into problems and can't figure out for 
the life of me what I am doing wrong.

The goal is to send a message to the instructor's server and process the 
response from the server. The request message must meet the following 
requirements:

   - Request must be encoded as bytes, where the header - the first two 
   bytes - represents a short integer conveying the length of the request 
   (excluding the header itself)
   - Message must be sent in Big Endian byte order
   
The following code shows my TCP client:

*(defn- receive*
*  "Given a socket create a DataInputStream and process the server*
*  response"*
*  [reader socket]*
*  (let [bytes-in  (make-array Byte/TYPE util/max-message-size)*
*        info     {:type :receive :socket socket :count 
util/max-message-size}]*
*    (log info)*
*    (.read reader bytes-in 0 util/max-message-size)*
*    bytes-in))*

*(defn- transmit*
*  "Given a socket create a DataOutputStream and process the request to*
*  the server"*
*  [writer socket message]*
*  (let [bytes-out   (req/make-request (into {:socket socket} message))*
*        begin-info {:type :begin-transmit :socket socket :message 
bytes-out}*
*        end-info   {:type :end-transmit :writer writer}]*
*    (log begin-info)*
*    (.write writer bytes-out 0 (count bytes-out))*
*    (log end-info)*
*    (.flush writer)))*

*(defn send-request*
*  "Given a create a Socket and process the request"*
*  [msg]*
*  (with-open [socket (java.net.Socket.  (:host-ip msg) (:host-port msg))*
*              writer (DataOutputStream. (.getOutputStream socket))*
*              reader (DataInputStream.  (.getInputStream socket))]*
*    (log {:type :client})*
*    (transmit writer socket msg)*
*    (receive reader socket)))*

And here is the output this produces by calling send-request with some test 
data:

Initializing the TCP client ...

Transmitting request
-------------------------------
Message Size : 124 bytes
Host IP      : /192.168.xxx.xxx
Host Port    : 2605

0 121 124 82 69 81 124 0 0 1 69 -38 63 103 2 124 108 10 75 27 12 99 82 52 
109 107 58 111 16 95 45 13 114 127 3 69 124 71 108 101 97 115 111 110 78 
105 99 107 111 108 105 99 104 68 124 49 57 45 49 53 57 54 124 48 124 47 49 
57 50 46 49 54 56 46 49 46 49 50 51 124 53 52 51 54 50 124 50 49 124 47 49 
57 50 46 49 54 56 46 49 48 49 46 50 49 48 124 50 54 48 53 124 72 101 108 
108 111 32 116 104 101 114 101 124 49

Bytes written: 124 bytes

Receiving response
--------------------------------
Maximum Size : 146 bytes
Host IP      : /192.168.xxx.xxx
Host Port    : 2605

.....

No response from the server. It looks like my byte array is correct (as you 
can see the byte at index 0 is 0, followed by 121 representing the length 
of the request -- though the "bytes written" does appear to be 1 more than 
it should). Also, my understanding is that DataOutputStream sends data in 
Network order by default -- is this correct?

My next step is to try writing an echo server to see if I can at least 
communicate to myself. In the mean time, if anyone has any insight, it 
would be much appreciated!


-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to