javascript - How to implements Simple SSE Server using Java? -


i want implement server sent events (sse) using simple java server socket (instead php and/or asp).

this server simple things: listening incoming request browser, creates handler thread, reply request (sending header) without closing connection, , then, wait user input (system.in) forward messages client.

of course overkill if use j2ee library (eg. jersey) doing task that.

the source follow:

import java.net.*; import java.io.*; import java.util.scanner;  public class loc { public static void main ( string[] args ) throws ioexception{     serversocket ss = new serversocket(8888);     //listen 1 connection.     system.out.print("waiting connection...");      socket hp = ss.accept();     system.out.println("connected!");       bufferedreader br = new bufferedreader(new inputstreamreader(hp.getinputstream()));           string line = "";     while( br.ready() && (line=br.readline()) != null) { //dumps request header.         system.out.println(line);     }      thread handler = new thread(new clienthandler(hp));     handler.start();     try {         handler.join();     }catch(interruptedexception e){      }     system.out.println("server stopped.");     } }  class clienthandler implements runnable{  socket toclient;  public clienthandler(socket s){     this.toclient = s; }  public void run() {     try {         bufferedreader br = new bufferedreader(new inputstreamreader(system.in)); //server input (also forwards client)         bufferedwriter bw = new bufferedwriter(new outputstreamwriter(toclient.getoutputstream()));          // response header.         string response = "http/1.1 200 ok\n"+         "server: maknyos-server/1.0\n"+         "cache-control: no-cache,public\n"+         "content-type: text/event-stream\n"+         "connection: keep-alive\n"+         "language: en-us\n"+         "charset: utf-8\n"+         "\n"; //two line break header ending.          bw.write(response);         bw.flush();          string input = "";         while ( (input = br.readline()) != null ) { //one directional message client (browser), via cmd.              bw.write(input+'\n');             bw.flush();             if("close".equalsignorecase(input)){                 break;             }         }          toclient.close();     }catch(ioexception e){         system.out.println("ioexception! "+e);     }     } 

this client.

<h1>hullo world!</h1> <script type="text/javascript">      var es = new eventsource("http://localhost:8888");     es.onmessage = function (event) {         alert(event.data);     }; </script> 

when open html page, can see http request header on server std out (command line). server reply

http/1.1 200 ok server: maknyos-server/1.0 cache-control: no-cache,public content-type: text/event-stream connection: keep-alive language: en-us charset: utf-8   ... 

i'll try describe , problems, between 2 client , server. maybe related protocol, i'm not sure.

first, if put 2 (new line) @ end of header finish response header (as example above), firefox console tell me browser can't connect server. but, in net console, receives response request.

second, test without finishing response header (without double \n character).

neither of them succeeded in sending sse browser.

edit, when see again browser's console windows, appears cannot make request domain!

this program runs on localhost:8888 webserver use (for html page) on localhost:80

i suggest write application using spring boot , write controller return instance of sseemitter. spring boot lightweight , fits requirements. http://docs.spring.io/autorepo/docs/spring-framework/4.3.0.rc2/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/sseemitter.html

remember use send() method in thread.


Comments

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -