# HG changeset patch # User one # Date 1346495047 -32400 # Node ID 18fad65bc447af82e9e3fd485dfa3696d9ff6721 # Parent 85958cba5d1501d9fdde279c334da4273e51d861 Create MyRfbProto.java MyRfbProto.java is a summary of the intersection of MyRfbClient and MyRfbProxy. diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java --- a/src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/ServerInitMessage.java Sat Sep 01 19:24:07 2012 +0900 @@ -24,8 +24,6 @@ package com.glavsoft.rfb.encoding; -import java.io.IOException; - import com.glavsoft.exceptions.TransportException; import com.glavsoft.transport.Reader; diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java --- a/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/encoding/decoder/ZRLEESender.java Sat Sep 01 19:24:07 2012 +0900 @@ -1,6 +1,7 @@ package com.glavsoft.rfb.encoding.decoder; import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy; +import jp.ac.u_ryukyu.treevnc.client.MyRfbProtoClient; import com.glavsoft.drawing.Renderer; import com.glavsoft.exceptions.TransportException; @@ -14,7 +15,10 @@ public ZRLEESender(MyRfbProtoProxy rfb) { this.rfb = rfb; } - + + public ZRLEESender(MyRfbProtoClient rfb) { + } + @Override public void decode(Reader reader, Renderer renderer, FramebufferUpdateRectangle rect) throws TransportException { diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java Sat Sep 01 19:24:07 2012 +0900 @@ -44,8 +44,6 @@ import java.io.StringWriter; import java.util.logging.Logger; -import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy; - public class ReceiverTask implements Runnable { private static final byte FRAMEBUFFER_UPDATE = 0; private static final byte SET_COLOR_MAP_ENTRIES = 1; @@ -66,20 +64,6 @@ protected boolean needSendPixelFormat; public ReceiverTask(Reader reader, - IRepaintController repaintController, ClipboardController clipboardController, - DecodersContainer decoders, ProtocolContext context,boolean flag) { - this.reader = reader; - this.repaintController = repaintController; - this.clipboardController = clipboardController; - this.context = context; - this.decoders = decoders; - renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), - context.getPixelFormat()); - fullscreenFbUpdateIncrementalRequest = - new FramebufferUpdateRequestMessage(0, 0, context.getFbWidth(), context.getFbHeight(), true); - } - - public ReceiverTask(Reader reader, IRepaintController repaintController, ClipboardController clipboardController, DecodersContainer decoders, ProtocolContext context) { this.reader = reader; diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/com/glavsoft/rfb/protocol/TreeTask.java --- a/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/com/glavsoft/rfb/protocol/TreeTask.java Sat Sep 01 19:24:07 2012 +0900 @@ -1,6 +1,7 @@ package com.glavsoft.rfb.protocol; -import jp.ac.u_ryukyu.treevnc.server.*; +import jp.ac.u_ryukyu.treevnc.client.MyRfbProtoClient; +import jp.ac.u_ryukyu.treevnc.server.MyRfbProtoProxy; import com.glavsoft.rfb.ClipboardController; import com.glavsoft.rfb.IRepaintController; @@ -16,13 +17,19 @@ public TreeTask(Reader reader, IRepaintController repaintController, ClipboardController clipboardController, DecodersContainer decoders, ProtocolContext context, MyRfbProtoProxy rfb) { - super(reader, repaintController, clipboardController, decoders,context, true); + super(reader, repaintController, clipboardController, decoders, context); //super(reader, new NullRepaintController(), clipboardController, decoders,context, true); Decoder decoder = new ZRLEESender(rfb); decoders.setDecoderByType(EncodingType.ZLIB, decoder); decoders.setDecoderByType(EncodingType.ZRLE, decoder); } - + + public TreeTask(Reader reader, IRepaintController repaintController, + ClipboardController clipboardController, + DecodersContainer decoders, ProtocolContext context, MyRfbProtoClient rfb) { + super(reader, repaintController, clipboardController, decoders, context); + Decoder decoder = new ZRLEESender(rfb); + } /* public void framebufferUpdateMessage() throws CommonException { * * (non-Javadoc) diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/MyRfbProtoClient.java Sat Sep 01 19:24:07 2012 +0900 @@ -15,6 +15,7 @@ import java.util.zip.Inflater; import jp.ac.u_ryukyu.treevnc.MulticastQueue; +import jp.ac.u_ryukyu.treevnc.test.MyRfbProto; import com.glavsoft.exceptions.TransportException; @@ -24,7 +25,7 @@ import com.glavsoft.viewer.ContainerManager; import com.glavsoft.viewer.swing.ParametersHandler.ConnectionParams; -public class MyRfbProtoClient { +public class MyRfbProtoClient extends MyRfbProto { final static int FramebufferUpdate = 0; final static int CheckDelay = 11; final static String versionMsg_3_855 = "RFB 003.855\n"; diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/TextBoxClient.java Sat Sep 01 19:24:07 2012 +0900 @@ -95,6 +95,7 @@ contentPane.add(panel, BorderLayout.CENTER); } + /* private void reportWindow() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container pane = getContentPane(); @@ -104,6 +105,7 @@ label.setFont(new Font("Arial", Font.PLAIN, 20)); pane.add(label); } + */ public String getAddressOption() { while (!(flag)) { diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/client/WaitReply.java Sat Sep 01 19:24:07 2012 +0900 @@ -9,14 +9,12 @@ public class WaitReply extends Thread { InterfaceForViewer client; - private String treenum; boolean passflag; public WaitReply(String treenum, InterfaceForViewer client) { this.client = client; - this.treenum = treenum; } public boolean checkPath() { diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/AcceptClient.java Sat Sep 01 19:24:07 2012 +0900 @@ -121,14 +121,6 @@ } //displyLinkedList(ls); } - - private void displyLinkedList( LinkedList ls) { - int g = 0; - for (String bs : ls) { - System.out.println(g + "number" + bs); - g++; - } - } private String decisionLeader(int counter, int treebranch) { if ((counter - 1) % treebranch == 1) { // children in most young treenum diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/MyRfbProtoProxy.java Sat Sep 01 19:24:07 2012 +0900 @@ -13,7 +13,6 @@ import org.junit.Test; -import com.glavsoft.exceptions.CommonException; import com.glavsoft.exceptions.TransportException; import com.glavsoft.rfb.encoding.EncodingType; import com.glavsoft.rfb.protocol.Protocol; @@ -30,8 +29,9 @@ import java.util.zip.Inflater; import jp.ac.u_ryukyu.treevnc.MulticastQueue; +import jp.ac.u_ryukyu.treevnc.test.MyRfbProto; -public class MyRfbProtoProxy { +public class MyRfbProtoProxy extends MyRfbProto { final static String versionMsg_3_855 = "RFB 003.855\n"; /** * CheckMillis is one of new msgType for RFB 3.855. diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/RequestScreenThread.java Sat Sep 01 19:24:07 2012 +0900 @@ -1,7 +1,5 @@ package jp.ac.u_ryukyu.treevnc.server; -import java.io.IOException; - import com.glavsoft.rfb.protocol.Protocol; public class RequestScreenThread implements Runnable { diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java --- a/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/server/VncProxyService.java Sat Sep 01 19:24:07 2012 +0900 @@ -63,7 +63,6 @@ private AcceptClient aClient; private Thread bCast; private Thread accThread; - private Thread rfbThread; private AcceptThread acceptThread; private GetBroadCastProxy getCast; @@ -182,7 +181,6 @@ public void createConnection() { rfb.selectPort(5999); - rfbThread = new Thread(this); acceptThread = new AcceptThread(rfb, 5999); accThread = new Thread(acceptThread); getCast = new GetBroadCastProxy(this, diff -r 85958cba5d15 -r 18fad65bc447 src/main/java/jp/ac/u_ryukyu/treevnc/test/MyRfbProto.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/treevnc/test/MyRfbProto.java Sat Sep 01 19:24:07 2012 +0900 @@ -0,0 +1,276 @@ +package jp.ac.u_ryukyu.treevnc.test; + +import java.io.IOException; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.concurrent.atomic.AtomicInteger; + +import jp.ac.u_ryukyu.treevnc.MulticastQueue; +import jp.ac.u_ryukyu.treevnc.server.AcceptThread; +import jp.ac.u_ryukyu.treevnc.server.RequestScreenThread; + +import com.glavsoft.exceptions.TransportException; +import com.glavsoft.rfb.protocol.Protocol; +import com.glavsoft.rfb.protocol.ProtocolContext; +import com.glavsoft.transport.Reader; +import com.glavsoft.transport.Writer; + +public class MyRfbProto { + final static int CheckDelay = 11; + final static int FramebufferUpdate = 0; + private ProtocolContext context; + final static String versionMsg_3_855 = "RFB 003.855\n"; + private int clients; + private MulticastQueue> multicastqueue = new MulticastQueue>(); + private RequestScreenThread rThread; + private boolean proxyFlag = true; + + + public void newClient(AcceptThread acceptThread, final Socket newCli, + final Writer os, final Reader is) throws IOException { + // createBimgFlag = true; + // rfb.addSockTmp(newCli); + // addSock(newCli); + final int myId = clients; + final MulticastQueue.Client> c = multicastqueue.newClient(); + final AtomicInteger writerRunning = new AtomicInteger(); + writerRunning.set(1); + /** + * Timeout thread. If a client is suspended, it has top of queue + * indefinitely, which caused memory overflow. After the timeout, we + * poll the queue and discard it. Start long wait if writer is running. + */ + final Runnable timer = new Runnable() { + public void run() { + int count = 0; + for (;;) { + long timeout = 50000 / 8; + try { + synchronized (this) { + int state, flag; + writerRunning.set(0); + wait(timeout); + flag = 0; + while ((state = writerRunning.get()) == 0) { + c.poll(); // discard, should be timeout + count++; + if (flag == 0) { + System.out.println("Discarding " + myId + + " count=" + count); + flag = 1; + } + wait(10); // if this is too short, writer cannot + // take the poll, if this is too + // long, memory will overflow... + } + if (flag == 1) + System.out.println("Resuming " + myId + + " count=" + count); + if (state != 1) { + System.out.println("Client died " + myId); + break; + } + } + } catch (InterruptedException e) { + } + } + } + }; + new Thread(timer).start(); + /** + * discard all incoming from clients + */ + final Runnable reader = new Runnable() { + public void run() { + byte b[] = new byte[4096]; + for (;;) { + try { + int c = is.readByte(b); + if (c <= 0) + throw new IOException(); + // System.out.println("client read "+c); + } catch (IOException e) { + try { + writerRunning.set(2); + os.close(); + is.close(); + } catch (IOException e1) { + } catch (TransportException e1) { + e1.printStackTrace(); + } + return; + } catch (TransportException e) { + e.printStackTrace(); + } + } + } + }; + /** + * send packets to a client + */ + Runnable sender = new Runnable() { + public void run() { + writerRunning.set(1); + try { + requestThreadNotify(); + // rThread.checkDelay(); + + /** + * initial connection of RFB protocol + */ + sendRfbVersion(os); + // readVersionMsg(is); + readVersionMsg(is, os); + sendSecurityType(os); + readSecType(is); + sendSecResult(os); + readClientInit(is); + sendInitData(os); + new Thread(reader).start(); // discard incoming packet here + // after. + // writeFramebufferUpdateRequest(0,0, framebufferWidth, + // framebufferHeight, false ); + for (;;) { + LinkedList bufs = c.poll(); + int inputIndex = 0; + ByteBuffer header = bufs.get(inputIndex); + if (header == null) + continue; + else if (header.get(0) == CheckDelay) { + writeToClient(os, bufs, inputIndex); + continue; + } else if (header.get(0) == FramebufferUpdate) { + // System.out.println("client "+ myId); + } + /* + * if(i%20==0){ sendDataCheckDelay(); } i++; + */ + writeToClient(os, bufs, inputIndex); + writerRunning.set(1); // yes my client is awaking. + } + } catch (IOException e) { + try { + writerRunning.set(2); + os.close(); + } catch (IOException e1) { + } + /* if socket closed cliList.remove(newCli); */ + } catch (TransportException e) { + e.printStackTrace(); + } + } + + public void writeToClient(final Writer os, + LinkedList bufs, int inputIndex) + throws TransportException { + while (inputIndex < bufs.size()) { + ByteBuffer b = bufs.get(inputIndex++); + os.write(b.array(), b.position(), b.limit()); + } + os.flush(); + } + }; + clients++; + new Thread(sender).start(); + + } + + public synchronized void requestThreadNotify() { + rThread.reStart(); + } + + private void sendRfbVersion(Writer writer) throws IOException, TransportException { + // os.write(versionMsg_3_8.getBytes()); + writer.write(versionMsg_3_855.getBytes()); + } + + private int readVersionMsg(Reader reader, Writer writer) throws IOException, TransportException { + + byte[] b = new byte[12]; + + reader.readBytes(b); + + if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ') + || (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9') + || (b[6] < '0') || (b[6] > '9') || (b[7] != '.') + || (b[8] < '0') || (b[8] > '9') || (b[9] < '0') || (b[9] > '9') + || (b[10] < '0') || (b[10] > '9') || (b[11] != '\n')) { + throw new IOException("this is not an RFB server"); + } + + int rfbMajor = (b[4] - '0') * 100 + (b[5] - '0') * 10 + (b[6] - '0'); + int rfbMinor = (b[8] - '0') * 100 + (b[9] - '0') * 10 + (b[10] - '0'); + + if (rfbMajor < 3) { + throw new IOException( + "RFB server does not support protocol version 3"); + } + + if (rfbMinor == 855) { + sendProxyFlag(writer); + if (proxyFlag) + sendPortNumber(writer); + } + return rfbMinor; + } + + private void sendProxyFlag(Writer writer) throws TransportException { + if (proxyFlag) + writer.writeInt(1); + else + writer.writeInt(0); + } + + private void sendPortNumber(Writer writer) throws TransportException { + byte[] b = new byte[4]; + //b = castIntByte(getHost.getPort()); + b = castIntByte(9999); + writer.write(b); + } + + private byte[] castIntByte(int len) { + byte[] b = new byte[4]; + b[0] = (byte) ((len >>> 24) & 0xFF); + b[1] = (byte) ((len >>> 16) & 0xFF); + b[2] = (byte) ((len >>> 8) & 0xFF); + b[3] = (byte) ((len >>> 0) & 0xFF); + return b; + } + + private void readSecType(Reader reader) throws TransportException { + byte[] b = new byte[1]; + reader.read(b); + } + + private void sendSecurityType(Writer os) throws TransportException { + // number-of-security-types + os.writeInt(1); + // security-types + // 1:None + os.writeInt(1); + + /* + * os.write(4); os.write(30); os.write(31); os.write(32); os.write(35); + * os.flush(); + */ + } + + private void sendSecResult(Writer os) throws TransportException { + byte[] b = castIntByte(0); + os.write(b); + } + + private void readClientInit(Reader in) throws TransportException { + byte[] b = new byte[0]; + in.readBytes(b); + } + + private void sendInitData(Writer os) throws TransportException { + os.write(context.getInitData()); + } + + public void setProtocolContext(Protocol workingProtocol) { + context = workingProtocol; + } +} diff -r 85958cba5d15 -r 18fad65bc447 src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java --- a/src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/ConnectionManager.java Sat Sep 01 19:24:07 2012 +0900 @@ -38,10 +38,6 @@ import java.net.Socket; import java.net.UnknownHostException; -import jp.ac.u_ryukyu.treevnc.client.GetDataClient; -import jp.ac.u_ryukyu.treevnc.client.GetHostClient; -import jp.ac.u_ryukyu.treevnc.client.TextBoxClient; - public class ConnectionManager implements Serializable { /** diff -r 85958cba5d15 -r 18fad65bc447 src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java --- a/src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/ContainerManager.java Sat Sep 01 19:24:07 2012 +0900 @@ -34,7 +34,6 @@ import java.awt.event.*; import java.io.Serializable; -import jp.ac.u_ryukyu.treevnc.client.MyVncClient; public class ContainerManager implements Serializable { /** diff -r 85958cba5d15 -r 18fad65bc447 src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java --- a/src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java Fri Aug 31 18:21:20 2012 +0900 +++ b/src/viewer_swing/java/com/glavsoft/viewer/TreeConnectionManager.java Sat Sep 01 19:24:07 2012 +0900 @@ -26,7 +26,6 @@ @Override public Socket connectToHost(final ParametersHandler.ConnectionParams connectionParams, ProtocolSettings settings) { Socket socket = null; - boolean wasError = false; GetHostClient bCast = new GetHostClient("who"); bCast.createSocket(); bCast.sendData(); @@ -47,18 +46,15 @@ Viewer.logger.info("Connecting to host " + connectionParams.hostName + ":" + connectionParams.portNumber); try { socket = new Socket(connectionParams.hostName, connectionParams.portNumber); - wasError = false; } catch (UnknownHostException e) { Viewer.logger.severe("Unknown host: " + connectionParams.hostName); showConnectionErrorDialog("Unknown host: '" + connectionParams.hostName + "'"); - wasError = true; } catch (IOException e) { Viewer.logger.severe("Couldn't connect to: " + connectionParams.hostName + ":" + connectionParams.portNumber + ": " + e.getMessage()); showConnectionErrorDialog("Couldn't connect to: '" + connectionParams.hostName + "'\n" + e.getMessage()); - wasError = true; } return socket; }