Writing a Web Server

Posted on 2006-05-17
Medium Priority
Last Modified: 2011-08-18
Hi all,

I am writing a *simple* web server in Java.  It's finished except that the headers are sent and displayed with the rest of the message body in the browser.

Any idea how to fix this?  It seems like as long as the headers are the first lines to be written (followed by a CRLF) the browser should know what to do with them, right?



 * WebServer.java
 * Created on May 17, 2006, 5:51 AM
 * Author:  Ross Dakin
import java.io.* ;
import java.lang.* ;
import java.net.* ;
import java.util.* ;

public final class WebServer
      public static void main(String argv[]) throws Exception
      // Set the port number.
      int port = 6789;
      // Establish the listen socket.

      ServerSocket serverSocket = null;
      try {
         serverSocket = new ServerSocket(port);
      catch (IOException e) {

      // Process HTTP service requests in an infinite loop.
      while (true) {
            // Listen for a TCP connection request.
            Socket clientSocket = null;
            try {
               clientSocket = serverSocket.accept();
            catch (IOException e) {
            // Construct an object to process the HTTP request message.
            HttpRequest request = new HttpRequest(clientSocket);
            // Create a new thread to process the request.
            Thread thread = new Thread(request);
            // Start the thread.
      } // end while
  } // end main()
} // end WebServer class

final class HttpRequest implements Runnable
          final static String CRLF = "\r\n";
          Socket socket;
          // Constructor
          public HttpRequest(Socket socket) throws Exception
                this.socket = socket;
          // Implement the run() method of the Runnable interface.
          public void run()
              try {
              } catch (Exception e) {
      // Process each request.
          private void processRequest() throws Exception
              // Get a reference to the socket's input and output streams.
              InputStream is = socket.getInputStream();
              DataOutputStream os = new DataOutputStream(socket.getOutputStream());
              // Set up input stream filters.
              BufferedReader br = new BufferedReader(
                            new InputStreamReader(is));
              // Get the request line of the HTTP request message.
          String requestLine = br.readLine();
          // Display the request line.
          // Get and display the header lines.
          String headerLine = null;
          while ((headerLine = br.readLine()).length() != 0) {
          // Extract the filename from the request line.
          StringTokenizer tokens = new StringTokenizer(requestLine);
          tokens.nextToken();  // skip over the method, which should be "GET"
          String fileName = tokens.nextToken();
          // Prepend a "." so that file request is within the current directory.
          fileName = "." + fileName;
          // Open the requested file.
          FileInputStream fis = null;
          boolean fileExists = true;
          try {
                fis = new FileInputStream(fileName);
          } catch (FileNotFoundException e) {
                fileExists = false;
          // Construct the response message.
          String statusLine = null;
          String contentTypeLine = null;
          String entityBody = null;
          if (fileExists) {
                statusLine = "200 OK" + CRLF;
                contentTypeLine = "Content-type: " +
                      contentType( fileName ) + CRLF;
          } else {
                statusLine = "404 Not Found" + CRLF;
                contentTypeLine = "Content-type: " +
                  "text/html" + CRLF;
                entityBody = "<HTML>" +
                      "<HEAD><TITLE>Not Found</TITLE></HEAD>" +
                      "<BODY>Not Found</BODY></HTML>";
          // Send the status line.
          // Send the content type line.
          // Send a blank line to indicate the end of the header lines.
          // Send the entity body.
          if (fileExists)      {
                sendBytes(fis, os);
          } else {
          // Close streams and socket.
          } // end run()
          // Send bytes from disk to output stream, passing through buffer.
          private static void sendBytes(FileInputStream fis, OutputStream os)
      throws Exception
         // Construct a 1K buffer to hold bytes on their way to the socket.
         byte[] buffer = new byte[1024];
         int bytes = 0;
         // Copy requested file into the socket's output stream.
         while((bytes = fis.read(buffer)) != -1 ) {
            os.write(buffer, 0, bytes);
      } // end sendBytes
      // Determine MIME type of file.
      private static String contentType(String fileName)
      throws Exception
          String mimeFileName = "mime.dat";
          // Open the MIME type data file.
          FileReader mimeFile = null;
          try {
                mimeFile = new FileReader(mimeFileName);
          } catch (FileNotFoundException e) {
          // Read the file
          BufferedReader mimeBr = new BufferedReader (mimeFile);
          // Loop through lines in file.
          String fileLine = null;
          while ((fileLine = mimeBr.readLine()) !=null)
              // Tokenize the line
              StringTokenizer mimeTokens = new StringTokenizer(fileLine);
              // If the file extention matches the request, return its type
              if(fileName.endsWith( mimeTokens.nextToken()) ) {
                        return mimeTokens.nextToken();
              // Matching MIME type was found.
              return "application/octet-stream";
      } // end contentType

} // end HttpRequest class


.3dm      x-world/x-3dmf
.3dmf      x-world/x-3dmf
.a      application/octet-stream
.aab      application/x-authorware-bin
.aam      application/x-authorware-map
.aas      application/x-authorware-seg
.abc      text/vnd.abc
.acgi      text/html
.afl      video/animaflex
.ai      application/postscript
.aif      audio/aiff
.aif      audio/x-aiff
.aifc      audio/aiff
.aifc      audio/x-aiff
.aiff      audio/aiff
.aiff      audio/x-aiff
.aim      application/x-aim
.aip      text/x-audiosoft-intra
.ani      application/x-navi-animation
.aos      application/x-nokia-9000-communicator-add-on-software
.aps      application/mime
.arc      application/octet-stream
.arj      application/arj
.arj      application/octet-stream
.art      image/x-jg
.asf      video/x-ms-asf
.asm      text/x-asm
.asp      text/asp
.asx      application/x-mplayer2
.asx      video/x-ms-asf
.asx      video/x-ms-asf-plugin
.au      audio/basic
.au      audio/x-au
.avi      application/x-troff-msvideo
.avi      video/avi
.avi      video/msvideo
.avi      video/x-msvideo
.avs      video/avs-video
.bcpio      application/x-bcpio
.bin      application/mac-binary
.bin      application/macbinary
.bin      application/octet-stream
.bin      application/x-binary
.bin      application/x-macbinary
.bm      image/bmp
.bmp      image/bmp
.bmp      image/x-windows-bmp
.boo      application/book
.book      application/book
.boz      application/x-bzip2
.bsh      application/x-bsh
.bz      application/x-bzip
.bz2      application/x-bzip2
.c      text/plain
.c      text/x-c
.c++      text/plain
.cat      application/vnd.ms-pki.seccat
.cc      text/plain
.cc      text/x-c
.ccad      application/clariscad
.cco      application/x-cocoa
.cdf      application/cdf
.cdf      application/x-cdf
.cdf      application/x-netcdf
.cer      application/pkix-cert
.cer      application/x-x509-ca-cert
.cha      application/x-chat
.chat      application/x-chat
.class      application/java
.class      application/java-byte-code
.class      application/x-java-class
.com      application/octet-stream
.com      text/plain
.conf      text/plain
.cpio      application/x-cpio
.cpp      text/x-c
.cpt      application/mac-compactpro
.cpt      application/x-compactpro
.cpt      application/x-cpt
.crl      application/pkcs-crl
.crl      application/pkix-crl
.crt      application/pkix-cert
.crt      application/x-x509-ca-cert
.crt      application/x-x509-user-cert
.csh      application/x-csh
.csh      text/x-script.csh
.css      application/x-pointplus
.css      text/css
.cxx      text/plain
.dcr      application/x-director
.deepv      application/x-deepv
.def      text/plain
.der      application/x-x509-ca-cert
.dif      video/x-dv
.dir      application/x-director
.dl      video/dl
.dl      video/x-dl
.doc      application/msword
.dot      application/msword
.dp      application/commonground
.drw      application/drafting
.dump      application/octet-stream
.dv      video/x-dv
.dvi      application/x-dvi
.dwf      drawing/x-dwf(old)
.dwf      model/vnd.dwf
.dwg      application/acad
.dwg      image/vnd.dwg
.dwg      image/x-dwg
.dxf      application/dxf
.dxf      image/vnd.dwg
.dxf      image/x-dwg
.dxr      application/x-director
.el      text/x-script.elisp
.elc      application/x-bytecode.elisp(compiledelisp)
.elc      application/x-elc
.env      application/x-envoy
.eps      application/postscript
.es      application/x-esrehber
.etx      text/x-setext
.evy      application/envoy
.evy      application/x-envoy
.exe      application/octet-stream
.f      text/plain
.f      text/x-fortran
.f77      text/x-fortran
.f90      text/plain
.f90      text/x-fortran
.fdf      application/vnd.fdf
.fif      application/fractals
.fif      image/fif
.fli      video/fli
.fli      video/x-fli
.flo      image/florian
.flx      text/vnd.fmi.flexstor
.fmf      video/x-atomic3d-feature
.for      text/plain
.for      text/x-fortran
.fpx      image/vnd.fpx
.fpx      image/vnd.net-fpx
.frl      application/freeloader
.funk      audio/make
.g      text/plain
.g3      image/g3fax
.gif      image/gif
.gl      video/gl
.gl      video/x-gl
.gsd      audio/x-gsm
.gsm      audio/x-gsm
.gsp      application/x-gsp
.gss      application/x-gss
.gtar      application/x-gtar
.gz      application/x-compressed
.gz      application/x-gzip
.gzip      application/x-gzip
.gzip      multipart/x-gzip
.h      text/plain
.h      text/x-h
.hdf      application/x-hdf
.help      application/x-helpfile
.hgl      application/vnd.hp-hpgl
.hh      text/plain
.hh      text/x-h
.hlb      text/x-script
.hlp      application/hlp
.hlp      application/x-helpfile
.hlp      application/x-winhelp
.hpg      application/vnd.hp-hpgl
.hpgl      application/vnd.hp-hpgl
.hqx      application/binhex
.hqx      application/binhex4
.hqx      application/mac-binhex
.hqx      application/mac-binhex40
.hqx      application/x-binhex40
.hqx      application/x-mac-binhex40
.hta      application/hta
.htc      text/x-component
.htm      text/html
.html      text/html
.htmls      text/html
.htt      text/webviewhtml
.htx      text/html
.ice      x-conference/x-cooltalk
.ico      image/x-icon
.idc      text/plain
.ief      image/ief
.iefs      image/ief
.iges      application/iges
.iges      model/iges
.igs      application/iges
.igs      model/iges
.ima      application/x-ima
.imap      application/x-httpd-imap
.inf      application/inf
.ins      application/x-internett-signup
.ip      application/x-ip2
.isu      video/x-isvideo
.it      audio/it
.iv      application/x-inventor
.ivr      i-world/i-vrml
.ivy      application/x-livescreen
.jam      audio/x-jam
.jav      text/plain
.jav      text/x-java-source
.java      text/plain
.java      text/x-java-source
.jcm      application/x-java-commerce
.jfif      image/jpeg
.jfif      image/pjpeg
.jfif-tbnl      image/jpeg
.jpe      image/jpeg
.jpe      image/pjpeg
.jpeg      image/jpeg
.jpeg      image/pjpeg
.jpg      image/jpeg
.jpg      image/pjpeg
.jps      image/x-jps
.js      application/x-javascript
.jut      image/jutvision
.kar      audio/midi
.kar      music/x-karaoke
.ksh      application/x-ksh
.ksh      text/x-script.ksh
.la      audio/nspaudio
.la      audio/x-nspaudio
.lam      audio/x-liveaudio
.latex      application/x-latex
.lha      application/lha
.lha      application/octet-stream
.lha      application/x-lha
.lhx      application/octet-stream
.list      text/plain
.lma      audio/nspaudio
.lma      audio/x-nspaudio
.log      text/plain
.lsp      application/x-lisp
.lsp      text/x-script.lisp
.lst      text/plain
.lsx      text/x-la-asf
.ltx      application/x-latex
.lzh      application/octet-stream
.lzh      application/x-lzh
.lzx      application/lzx
.lzx      application/octet-stream
.lzx      application/x-lzx
.m      text/plain
.m      text/x-m
.m1v      video/mpeg
.m2a      audio/mpeg
.m2v      video/mpeg
.m3u      audio/x-mpequrl
.man      application/x-troff-man
.map      application/x-navimap
.mar      text/plain
.mbd      application/mbedlet
.mc$      application/x-magic-cap-package-1.0
.mcd      application/mcad
.mcd      application/x-mathcad
.mcf      image/vasa
.mcf      text/mcf
.mcp      application/netmc
.me      application/x-troff-me
.mht      message/rfc822
.mhtml      message/rfc822
.mid      application/x-midi
.mid      audio/midi
.mid      audio/x-mid
.mid      audio/x-midi
.mid      music/crescendo
.mid      x-music/x-midi
.midi      application/x-midi
.midi      audio/midi
.midi      audio/x-mid
.midi      audio/x-midi
.midi      music/crescendo
.midi      x-music/x-midi
.mif      application/x-frame
.mif      application/x-mif
.mime      message/rfc822
.mime      www/mime
.mjf      audio/x-vnd.audioexplosion.mjuicemediafile
.mjpg      video/x-motion-jpeg
.mm      application/base64
.mm      application/x-meme
.mme      application/base64
.mod      audio/mod
.mod      audio/x-mod
.moov      video/quicktime
.mov      video/quicktime
.movie      video/x-sgi-movie
.mp2      audio/mpeg
.mp2      audio/x-mpeg
.mp2      video/mpeg
.mp2      video/x-mpeg
.mp2      video/x-mpeq2a
.mp3      audio/mpeg3
.mp3      audio/x-mpeg-3
.mp3      video/mpeg
.mp3      video/x-mpeg
.mpa      audio/mpeg
.mpa      video/mpeg
.mpc      application/x-project
.mpe      video/mpeg
.mpeg      video/mpeg
.mpg      audio/mpeg
.mpg      video/mpeg
.mpga      audio/mpeg
.mpp      application/vnd.ms-project
.mpt      application/x-project
.mpv      application/x-project
.mpx      application/x-project
.mrc      application/marc
.ms      application/x-troff-ms
.mv      video/x-sgi-movie
.my      audio/make
.mzz      application/x-vnd.audioexplosion.mzz
.nap      image/naplps
.naplps      image/naplps
.nc      application/x-netcdf
.ncm      application/vnd.nokia.configuration-message
.nif      image/x-niff
.niff      image/x-niff
.nix      application/x-mix-transfer
.nsc      application/x-conference
.nvd      application/x-navidoc
.o      application/octet-stream
.oda      application/oda
.omc      application/x-omc
.omcd      application/x-omcdatamaker
.omcr      application/x-omcregerator
.p      text/x-pascal
.p10      application/pkcs10
.p10      application/x-pkcs10
.p12      application/pkcs-12
.p12      application/x-pkcs12
.p7a      application/x-pkcs7-signature
.p7c      application/pkcs7-mime
.p7c      application/x-pkcs7-mime
.p7m      application/pkcs7-mime
.p7m      application/x-pkcs7-mime
.p7r      application/x-pkcs7-certreqresp
.p7s      application/pkcs7-signature
.part      application/pro_eng
.pas      text/pascal
.pbm      image/x-portable-bitmap
.pcl      application/vnd.hp-pcl
.pcl      application/x-pcl
.pct      image/x-pict
.pcx      image/x-pcx
.pdb      chemical/x-pdb
.pdf      application/pdf
.pfunk      audio/make
.pfunk      audio/make.my.funk
.pgm      image/x-portable-graymap
.pgm      image/x-portable-greymap
.pic      image/pict
.pict      image/pict
.pkg      application/x-newton-compatible-pkg
.pko      application/vnd.ms-pki.pko
.pl      text/plain
.pl      text/x-script.perl
.plx      application/x-pixclscript
.pm      image/x-xpixmap
.pm      text/x-script.perl-module
.pm4      application/x-pagemaker
.pm5      application/x-pagemaker
.png      image/png
.pnm      application/x-portable-anymap
.pnm      image/x-portable-anymap
.pot      application/mspowerpoint
.pot      application/vnd.ms-powerpoint
.pov      model/x-pov
.ppa      application/vnd.ms-powerpoint
.ppm      image/x-portable-pixmap
.pps      application/mspowerpoint
.pps      application/vnd.ms-powerpoint
.ppt      application/mspowerpoint
.ppt      application/powerpoint
.ppt      application/vnd.ms-powerpoint
.ppt      application/x-mspowerpoint
.ppz      application/mspowerpoint
.pre      application/x-freelance
.prt      application/pro_eng
.ps      application/postscript
.psd      application/octet-stream
.pvu      paleovu/x-pv
.pwz      application/vnd.ms-powerpoint
.py      text/x-script.phyton
.pyc      applicaiton/x-bytecode.python
.qcp      audio/vnd.qcelp
.qd3      x-world/x-3dmf
.qd3d      x-world/x-3dmf
.qif      image/x-quicktime
.qt      video/quicktime
.qtc      video/x-qtc
.qti      image/x-quicktime
.qtif      image/x-quicktime
.ra      audio/x-pn-realaudio
.ra      audio/x-pn-realaudio-plugin
.ra      audio/x-realaudio
.ram      audio/x-pn-realaudio
.ras      application/x-cmu-raster
.ras      image/cmu-raster
.ras      image/x-cmu-raster
.rast      image/cmu-raster
.rexx      text/x-script.rexx
.rf      image/vnd.rn-realflash
.rgb      image/x-rgb
.rm      application/vnd.rn-realmedia
.rm      audio/x-pn-realaudio
.rmi      audio/mid
.rmm      audio/x-pn-realaudio
.rmp      audio/x-pn-realaudio
.rmp      audio/x-pn-realaudio-plugin
.rng      application/ringing-tones
.rng      application/vnd.nokia.ringing-tone
.rnx      application/vnd.rn-realplayer
.roff      application/x-troff
.rp      image/vnd.rn-realpix
.rpm      audio/x-pn-realaudio-plugin
.rt      text/richtext
.rt      text/vnd.rn-realtext
.rtf      application/rtf
.rtf      application/x-rtf
.rtf      text/richtext
.rtx      application/rtf
.rtx      text/richtext
.rv      video/vnd.rn-realvideo
.s      text/x-asm
.s3m      audio/s3m
.saveme      application/octet-stream
.sbk      application/x-tbook
.scm      application/x-lotusscreencam
.scm      text/x-script.guile
.scm      text/x-script.scheme
.scm      video/x-scm
.sdml      text/plain
.sdp      application/sdp
.sdp      application/x-sdp
.sdr      application/sounder
.sea      application/sea
.sea      application/x-sea
.set      application/set
.sgm      text/sgml
.sgm      text/x-sgml
.sgml      text/sgml
.sgml      text/x-sgml
.sh      application/x-bsh
.sh      application/x-sh
.sh      application/x-shar
.sh      text/x-script.sh
.shar      application/x-bsh
.shar      application/x-shar
.shtml      text/html
.shtml      text/x-server-parsed-html
.sid      audio/x-psid
.sit      application/x-sit
.sit      application/x-stuffit
.skd      application/x-koan
.skm      application/x-koan
.skp      application/x-koan
.skt      application/x-koan
.sl      application/x-seelogo
.smi      application/smil
.smil      application/smil
.snd      audio/basic
.snd      audio/x-adpcm
.sol      application/solids
.spc      application/x-pkcs7-certificates
.spc      text/x-speech
.spl      application/futuresplash
.spr      application/x-sprite
.sprite      application/x-sprite
.src      application/x-wais-source
.ssi      text/x-server-parsed-html
.ssm      application/streamingmedia
.sst      application/vnd.ms-pki.certstore
.step      application/step
.stl      application/sla
.stl      application/vnd.ms-pki.stl
.stl      application/x-navistyle
.stp      application/step
.sv4cpio      application/x-sv4cpio
.sv4crc      application/x-sv4crc
.svf      image/vnd.dwg
.svf      image/x-dwg
.svr      application/x-world
.svr      x-world/x-svr
.swf      application/x-shockwave-flash
.t      application/x-troff
.talk      text/x-speech
.tar      application/x-tar
.tbk      application/toolbook
.tbk      application/x-tbook
.tcl      application/x-tcl
.tcl      text/x-script.tcl
.tcsh      text/x-script.tcsh
.tex      application/x-tex
.texi      application/x-texinfo
.texinfo      application/x-texinfo
.text      application/plain
.text      text/plain
.tgz      application/gnutar
.tgz      application/x-compressed
.tif      image/tiff
.tif      image/x-tiff
.tiff      image/tiff
.tiff      image/x-tiff
.tr      application/x-troff
.tsi      audio/tsp-audio
.tsp      application/dsptype
.tsp      audio/tsplayer
.tsv      text/tab-separated-values
.turbot      image/florian
.txt      text/plain
.uil      text/x-uil
.uni      text/uri-list
.unis      text/uri-list
.unv      application/i-deas
.uri      text/uri-list
.uris      text/uri-list
.ustar      application/x-ustar
.ustar      multipart/x-ustar
.uu      application/octet-stream
.uu      text/x-uuencode
.uue      text/x-uuencode
.vcd      application/x-cdlink
.vcs      text/x-vcalendar
.vda      application/vda
.vdo      video/vdo
.vew      application/groupwise
.viv      video/vivo
.viv      video/vnd.vivo
.vivo      video/vivo
.vivo      video/vnd.vivo
.vmd      application/vocaltec-media-desc
.vmf      application/vocaltec-media-file
.voc      audio/voc
.voc      audio/x-voc
.vos      video/vosaic
.vox      audio/voxware
.vqe      audio/x-twinvq-plugin
.vqf      audio/x-twinvq
.vql      audio/x-twinvq-plugin
.vrml      application/x-vrml
.vrml      model/vrml
.vrml      x-world/x-vrml
.vrt      x-world/x-vrt
.vsd      application/x-visio
.vst      application/x-visio
.vsw      application/x-visio
.w60      application/wordperfect6.0
.w61      application/wordperfect6.1
.w6w      application/msword
.wav      audio/wav
.wav      audio/x-wav
.wb1      application/x-qpro
.wbmp      image/vnd.wap.wbmp
.web      application/vnd.xara
.wiz      application/msword
.wk1      application/x-123
.wmf      windows/metafile
.wml      text/vnd.wap.wml
.wmlc      application/vnd.wap.wmlc
.wmls      text/vnd.wap.wmlscript
.wmlsc      application/vnd.wap.wmlscriptc
.word      application/msword
.wp      application/wordperfect
.wp5      application/wordperfect
.wp5      application/wordperfect6.0
.wp6      application/wordperfect
.wpd      application/wordperfect
.wpd      application/x-wpwin
.wq1      application/x-lotus
.wri      application/mswrite
.wri      application/x-wri
.wrl      application/x-world
.wrl      model/vrml
.wrl      x-world/x-vrml
.wrz      model/vrml
.wrz      x-world/x-vrml
.wsc      text/scriplet
.wsrc      application/x-wais-source
.wtk      application/x-wintalk
.xbm      image/x-xbitmap
.xbm      image/x-xbm
.xbm      image/xbm
.xdr      video/x-amt-demorun
.xgz      xgl/drawing
.xif      image/vnd.xiff
.xl      application/excel
.xla      application/excel
.xla      application/x-excel
.xla      application/x-msexcel
.xlb      application/excel
.xlb      application/vnd.ms-excel
.xlb      application/x-excel
.xlc      application/excel
.xlc      application/vnd.ms-excel
.xlc      application/x-excel
.xld      application/excel
.xld      application/x-excel
.xlk      application/excel
.xlk      application/x-excel
.xll      application/excel
.xll      application/vnd.ms-excel
.xll      application/x-excel
.xlm      application/excel
.xlm      application/vnd.ms-excel
.xlm      application/x-excel
.xls      application/excel
.xls      application/vnd.ms-excel
.xls      application/x-excel
.xls      application/x-msexcel
.xlt      application/excel
.xlt      application/x-excel
.xlv      application/excel
.xlv      application/x-excel
.xlw      application/excel
.xlw      application/vnd.ms-excel
.xlw      application/x-excel
.xlw      application/x-msexcel
.xm      audio/xm
.xml      application/xml
.xml      text/xml
.xmz      xgl/movie
.xpix      application/x-vnd.ls-xpix
.xpm      image/x-xpixmap
.xpm      image/xpm
.x-png      image/png
.xsr      video/x-amt-showrun
.xwd      image/x-xwd
.xwd      image/x-xwindowdump
.xyz      chemical/x-pdb
.z      application/x-compress
.z      application/x-compressed
.zip      application/x-compressed
.zip      application/x-zip-compressed
.zip      application/zip
.zip      multipart/x-zip
.zoo      application/octet-stream
.zsh      text/x-script.zsh
Question by:mistagitar
LVL 12

Expert Comment

ID: 16706322
You must parse those lines.

Author Comment

ID: 16706486
You mean the MIME extentions?  Those work, I only posted them in case you wanted to test the code and need the mime.dat file.

So still, any idea why the browser shows the header lines?

LVL 12

Accepted Solution

Giant2 earned 1000 total points
ID: 16706514
you write:
          // Send the status line.
>          os.writeBytes(statusLine);
          // Send the content type line.
>          os.writeBytes(contentTypeLine);
          // Send a blank line to indicate the end of the header lines.
>          os.writeBytes(CRLF);

As normal send. The HTTP header has it's own protocol. See here:

If you send in the manner you do, the browser cannot recognize it's an header. It see only a it could be a part of an HTML page.
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

LVL 12

Assisted Solution

Giant2 earned 1000 total points
ID: 16706539
If you want to see an header on working see here:

Expert Comment

by:Igor Bazarny
ID: 16706586
Do you insert extra CRLF between last header and content? I wonder why would you need to hand-code http server, BTW

Expert Comment

ID: 16706847
There should be an empty line between header and body
Secondly, i am wondering if it should
final static String CRLF = "\r\n";
final static String CRLF = "\n"; \\ just \n??

Author Comment

ID: 16707011
Ahhh, got it.  I just had to add "HTTP/1.1 " to the besinning of the status line.

Thanks for the help, especially the RFC...


Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
The viewer will learn how to implement Singleton Design Pattern in Java.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
Suggested Courses
Course of the Month15 days, 3 hours left to enroll

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question