ok. I think I understand your problem and was able to reproduce it. The first thing that jumps out at me is that you are using BufferedWriter. The problem here is that, your output stream is buffered. I would suggest placing a call to out.flush() after writing out your "</html>" string. On my machine, this solved the problem. BufferedWriter has an internal buffer size of 8192 bytes. If you want to make sure that some of your response does not get left in this buffer, you must implicitly call flush().
So I would suggest you try a few things: 1. call flush() at the end of your writing back to the client 2. place your response in a StringBuffer and then write the buffer to the client, along with a call to flush 3. don't use a buffered stream. On 4/12/07, Eugene Labunsky <[EMAIL PROTECTED]> wrote:
Dear Mark, I have problem with OUTPUT data, but TreeMap used for parsing of HTTP request header. No problems with the short sample reply, but try my code with added 1024 http lines, run this HTTP server and then try 2-3 times refresh http://server/ Review my sample (just run()): public void run() { String url; Map headers = new TreeMap(); BufferedReader in = new BufferedReader( new InputStreamReader(this.in)); PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(this.out))); try { // Get request URL. url = in.readLine().split(" ")[1]; // Read header String line; while ((line = in.readLine()) != null && !line.equals("")) { String[] tokens = line.split(": "); headers.put(tokens[0], tokens[1]); } // Write header out.println("HTTP/1.0 200 OK"); out.println("Content-Type: text/html"); out.println("Server: MINA Example"); out.println(); out.println("<html><head></head><body>"); Iterator it = headers.entrySet().iterator(); while (it.hasNext()) { Entry e = (Entry) it.next(); out.println("<p>" + e.getKey() + "-" + e.getValue() + "</p>"); } for (int i = 0; i < 1024; i++) { out.println("<p>this is line: " + i + "</p>"); } out.println("</body></html>"); } catch (Exception e) { e.printStackTrace(); } finally { out.flush(); out.close(); try { in.close(); } catch (IOException e) { } } } You can see no any Hash etc... Just for(;;) and println to PrintWriter. You will see after 2nd refresh MINA HTTP server will be missed about top part of HTTP reply. But if you will delete header parsing part and keep just 1024 lines output MINA will reply correct. This is strange... This code works correctly: public void run() { String url; Map headers = new TreeMap(); BufferedReader in = new BufferedReader( new InputStreamReader(this.in)); PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(this.out))); try { // Write header out.println("HTTP/1.0 200 OK"); out.println("Content-Type: text/html"); out.println("Server: MINA Example"); out.println(); out.println("<html><head></head><body>"); for (int i = 0; i < 1024; i++) { out.println("<p>this is line: " + i + "</p>"); } out.println("</body></html>"); } catch (Exception e) { e.printStackTrace(); } finally { out.flush(); out.close(); try { in.close(); } catch (IOException e) { } } } >Sorry. Its not a HashMap, but a TreeMap. >http://mina.apache.org/report/1.1/xref/org/apache/mina/example/httpserver/stream/HttpProtocolHandler.html#69 >TreeMaps use natural ordering, so I am still not sure that ordering can be >guaranteed. The reason I mention ordering is that when you pull the >information out of the TreeMap, it might not come out in the same order in >which it was put in. >I hope this clears up my previous statements. > > Dear Mark, > > I've added output to the STREAM example (just Main & HttpProtocolHandler > classes). > In this sample I can't see any HashMap, just write to PrintWriter and > finally flush & close it (I keep all sample just added those 2 lines of > code > for output 1024 lines). > Could you advise me, where is problem? > > >Based on previous discussions on this mailing list, I think that the > >'codec' based HTTP example is the preferred method. If you are > >placing each line in to a HashMap as per the example, this could be > >your problem because HashMaps do not guarantee order. Check the API > >javadocs for more information. > > -- > ..Cheers > > Mark > > > On 4/12/07, Eugene Labunsky <[EMAIL PROTECTED]> wrote: > > Hello, > > > > I have problem with http stream output. > > I have project based on http stream sample and found that MINA can't > > output > > more than 200 lines http reply correctly. It mixed lines in reply ;( > First > > time it reply correct, then not. I have added small peace of code to > > public > > void run() in sample: > > > > for (int i=0;i<1024;i++) > > out.println("<p>this is line: " + i+"</p>"); > > > > And ... With all available MINA releases I have problem. MINA can reply > > correctly or from 284 lines... Please, let me know where I'm wrong... > Regards, Eugene Labunsky.
-- ..Cheers Mark
