Establishing WebSocket connection with Java server and Javascript client -


i'm trying implement websockets javascript-based client , java-based server. think i've done correct steps, unknown reason, can't establish connection both.

when server socket receives connection, handles form websocket-accept response, , sends client, connection in client socket instantly close, weird there's no handshake problem.

does have idea might problem?

here's server code implemented in java:

package server;  import java.io.ioexception; import java.net.serversocket; import java.net.socket; import java.util.arraylist; import java.util.list;  import server.message.message; import server.message.speakmessage;   public class server implements connectionlistener {     private static final int port = 1509;     private messagedispatcher dispatcher = new messagedispatcher();     private list<connectionmanager> clients = new arraylist<>();      public void listen() {         try (serversocket server = new serversocket(port)) {             system.out.printf("listening on port %d...%n", port);             while (true) {                 system.out.println("waiting connection...");                 socket client = server.accept();                 system.out.println("incoming connection - attempting establish connection...");                 connectionmanager manager = new connectionmanager(client, dispatcher, this);                 manager.start();             }         } catch (ioexception e) {             system.out.println("unable start server");             e.printstacktrace();         }         system.exit(0);     }      public void execute() {         try {             while (true) {                 if (dispatcher.isempty()) {                     thread.sleep(100);                     continue;                 }                 message msg = dispatcher.read();                 if (msg instanceof speakmessage)                     broadcast(messageencoder.spoke(((speakmessage) msg).gettext()));             }         } catch (exception e) {             e.printstacktrace();             system.exit(1);         }     }      public static void main(string[] args) {         final server server = new server();         new thread(new runnable() {             @override             public void run() {                 server.listen();             }         }).start();         server.execute();     }      public synchronized void broadcast(byte[] message) {         (connectionmanager client : clients) {             client.send(message);         }     }      @override     public synchronized void clientconnected(connectionmanager who) {         clients.add(who);         system.out.println("connected client " + clients.size());     }      @override     public synchronized void clientdisconnected(connectionmanager who) {         clients.remove(who);     } } 

heres subclass connectionmanager of server:

package server;  import java.io.datainputstream; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstream; import java.lang.reflect.invocationtargetexception; import java.net.socket; import java.security.messagedigest; import java.util.properties;  import server.message.handshakemessage; import server.message.message;   public class connectionmanager {     private static final int client_version = 1;     private socket socket;     private messagedecoder decoder = new messagedecoder();     private messagedispatcher dispatcher;     private connectionlistener listener;      public connectionmanager(socket connection, messagedispatcher dispatcher, connectionlistener listener) {         socket = connection;         this.dispatcher = dispatcher;         this.listener = listener;     }      public void start() {         thread t = new thread(new channelreader());         t.setname("client thread");         t.setdaemon(true);         t.start();     }      public void send(byte[] data) {         if (socket == null)             return;          try {             dataoutputstream dos = new dataoutputstream(socket.getoutputstream());             dos.write(data);             dos.flush();         } catch (ioexception e) {             disconnect("client closed connection");         }     }      private class channelreader implements runnable {         private boolean accepted = false;         private string ret = null;          @override         public void run() {             try {                 datainputstream in = new datainputstream(socket.getinputstream());                 while (socket != null && socket.isconnected()) {                     int len = in.readshort();                     if (len < 0) {                         disconnect("invalid message length.");                     }                      string s;                     readline(in);                     properties props = new properties();                     while((s=readline(in)) != null && !s.equals("")) {                         string[] q = s.split(": ");                         props.put(q[0], q[1]);                     }                      if(props.get("upgrade").equals("websocket") && props.get("sec-websocket-version").equals("13")) { // check if websocket 8                         string key = (string) props.get("sec-websocket-key");                         string r = key + "" + "258eafa5-e914-47da-95ca-c5ab0dc85b11"; // magic key                         messagedigest md = messagedigest.getinstance("sha-1");                         md.reset();                         md.update(r.getbytes());                         byte[] sha1hash = md.digest();                           string returnbase = base64(sha1hash);                           ret = "http/1.1 101 switching protocols\r\n";                             ret+="upgrade: websocket\r\n";                             ret+="connection: upgrade\r\n";                             ret+="sec-websocket-accept: "+returnbase;                      } else {                         disconnect("client got wrong version of websocket");                     }                      message msg = decoder.decode((string) props.get("sec-websocket-protocol"));                      if (!accepted) {                         dohandshake(msg);                     } else if (dispatcher != null) {                         dispatcher.dispatch(msg);                     }                 }             } catch (exception e) {                 disconnect(e.getmessage());                 e.printstacktrace();             }         }          private void dohandshake(message msg) {             if (!(msg instanceof handshakemessage)) {                 disconnect("missing handshake message");                 return;             }             handshakemessage handshake = (handshakemessage) msg;             if (handshake.getversion() != client_version) {                 disconnect("client failed in handshake.");                 return;             }             send(ret.getbytes());             accepted = true;             listener.clientconnected(connectionmanager.this);         }             private string base64(byte[] input) throws classnotfoundexception,          securityexception, nosuchmethodexception, illegalargumentexception,          illegalaccessexception, invocationtargetexception, instantiationexception {             class<?> c = class.forname("sun.misc.base64encoder");             java.lang.reflect.method m = c.getmethod("encode", new class<?>[]{byte[].class});             string s = (string) m.invoke(c.newinstance(), input);             return s;         }          private string readline(inputstream in) {             try{                 string line = "";                 int pread;                 int read = 0;                 while(true) {                     pread = read;                     read = in.read();                     if(read!=13&&read!=10)                         line += (char) read;                     if(pread==13&&read==10) break;                 }                 return line;             }catch(ioexception ex){              }             return null;         }      }      public synchronized void disconnect(string message) {         system.err.println(message);         if (socket != null) {             try {                 socket.close();             } catch (ioexception e) {              }         }         socket = null;         listener.clientdisconnected(connectionmanager.this);     } } 

and messagedispatcher:

package server;  import java.util.queue; import java.util.concurrent.linkedblockingdeque;  import server.message.message;   public class messagedispatcher {     queue<message> messagequeue = new linkedblockingdeque<>();      public void dispatch(message message) {         messagequeue.offer(message);     }      public message read() {         return messagequeue.poll();     }      public boolean isempty() {         return messagequeue.isempty();     } } 

and heres client code implemented in javascript:

var canvas, // canvas dom element     ctx,    // canvas rendering context     socket; // socket connection  function init() {     // initialise canvas     canvas = document.getelementbyid("gamecanvas");     ctx = canvas.getcontext("2d");     // maximise canvas     canvas.width = window.innerwidth;     canvas.height = window.innerheight;      // initialise socket connection     if (window.websocket) {          socket = new websocket("ws://localhost:1509/", ["1", "yuri"]);         socket.onopen = onsocketconnected();         socket.onclose = onsocketdisconnect();         socket.onmessage = onsocketmessage();         socket.onerror = onsocketerror();     } else {         alert("the browser not support websocket.");     }  };  // socket message function onsocketmessage(message) {     console.log('message: ' + message.data); };  // socket error function onsocketerror(error) {     console.log('error: ' + error.data); };  // socket connected function onsocketconnected() {     console.log("connected socket server"); };  // socket disconnected function onsocketdisconnect() {     console.log("disconnected socket server"); }; 

i think, because using socket package on java server side , websocket api on client side. idea wrong technology. keep websocket on client side (javascript) becaue don't have lots of other possibilities, try jwebsocket on server side (java). in fact websocket using tcp/ip own communication protocol on tcp/ip. java socket package purely tcp/ip. re-write server jwebsocket, details jwebsocket can found at: http://jwebsocket.org/. hope answer you.


Comments

Popular posts from this blog

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -

node.js - Bad Request - node js ajax post -