public static String getAjaxTCP(String url, boolean isSimu) { String ip; int port; if (isSimu) { ip = SIMU_ROOT_IP; port = SIMU_ROOT_PORT; } else { ip = RootConfig.getInstance().getProperty(RootConfig.p_RootRelayServer); port = Integer.parseInt(RootConfig.getInstance().getProperty(RootConfig.p_RootRelayServerPort)); } return sendTCPToRoot(ip, port, MsgBuilder.DATA_ROOT_ONLINE_DB_EXEC, getParameterFromURL(url)); }
public class MsgBuilder { public static final int MAX_BYTE_ARRAY_LEN = 1024 * 1024 * 2; public static final short CHECK_BIT_NUM = 2; /** * 进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值. 如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节, * 最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes), 就变成1492 bytes for PPPoE。1450 for PPTP * connections 又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节. 这个1472字节就是我们可以使用的字节数。:) * 那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作. 鉴于 * Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时. 最好将UDP的数据长度控件在540字节 (576-8-20-PPPoE8)以内. * * <p>本参数须置于最前 */ public static final int UDP_INTERNET_BEST_MSS = 1414; // (含PPPoE8位, 1464), (1450 - 28 = 1422 - 8 = 1414) public static final int UDP_INTERNET_MIN_MSS = 540; // (含PPPoE8位) public static final int UDP_BYTE_SIZE = Integer.parseInt( RootConfig.getInstance().getProperty(RootConfig.p_DefaultUDPSize)); // 484;//548;//1464; /** 服务器如果发现可以切换的Relay,则进行连接并挂上; 具体:服务器在等待客户机未到时,发现可供其中继的,向其先发送本信令, 中继服务回应其信令,完成中继过程 */ public static final byte E_TAG_RELAY_REG = 1; public static final byte E_LINE_OFF_EXCEPTION = 2; public static final byte E_TAG_SERVER_RELAY_START = 3; // 中继服务器向其中继的客户(CS)发送切换中继服务信令, // 接受中继服务的服务器或客户机收到后进行中继切换。 public static final byte E_TAG_MOVE_TO_NEW_RELAY = 4; // 在执行'E_TAG_MOVE_TO_NEW_RELAY'前,即将关闭的中继服务器向可能提供中继后续服务的服务器,发送本信令, // 以通知进入接受状态,提供中继后续服务器回应本信令_BACK,表明其在线并可接受中继迁移。 public static final byte E_TAG_NOTIFY_TO_NEW_RELAY = 5; // 由于上述是在中继服务器间,所以需要增加_BACK,以免岐义 // public static final byte E_TAG_NOTIFY_TO_NEW_RELAY_BACK = 10; public static final byte E_TAG_SHUT_DOWN = 6; // 参见E_TAG_SHUT_DOWN_BETWEEN_CS,保留为未来可能的中继之用 public static final byte E_TAG_ROOT = 7; public static final byte E_TAG_DIRECT_CONN = 8; public static final byte E_TAG_UN_FORWARD_DATA = 9; public static final byte E_TAG_ACK = 10; public static final byte E_TAG_ROOT_UDP_ADDR_REG = 11; // 发送SUB_TAG型消息,只有头,没有信息体 public static final byte E_TAG_ONLY_SUB_TAG_MSG = 12; public static final byte E_TAG_MTU_1472 = 13; public static final byte E_RANDOM_FOR_CHECK_CK_PWD = 20; public static final byte E_AFTER_CERT_STATUS = 21; // 返回可能为服务已占满,密码错误,证书失效 public static final byte E_TRANS_NEW_CERT_KEY = 22; // 传输证书 public static final byte E_TRANS_ONE_TIME_CERT_KEY = 23; // 传输OneTime证书 public static final byte E_TRANS_SERVER_CONFIG = 24; public static final byte E_CLIENT_INFO = 25; public static final byte E_GOTO_URL_UN_XOR = 26; public static final byte E_RANDOM_FOR_CHECK_SERVER = 27; // UN_XOR_MSG_TAG_MIN以上(含),低于(含)此值,强制使用TCP public static final byte UN_XOR_MSG_TAG_MIN = 39; // 以上段,不进行加密解密处理, public static final byte E_SCREEN_EXT_MOUSE_ICON = 40; // 必须能重发 public static final byte E_CANVAS_MAIN = 50; public static final byte E_GOTO_URL = 51; public static final byte E_INPUT_EVENT = 52; public static final byte E_MENU_REFRESH = 53; // 用于服务器和手机端双向通知下线,需要加密,因为要保护Token public static final byte E_TAG_SHUT_DOWN_BETWEEN_CS = 60; public static final byte E_TRANS_NEW_CERT_KEY_IN_SECU_CHANNEL = 61; // 在线更新情形时,传输证书于加密通道, public static final byte E_TRANS_ONE_TIME_CERT_KEY_IN_SECU_CHANNEL = 62; // 传输OneTime证书于加密通道, public static final byte E_REPLY_TRANS_ONE_TIME_CERT_KEY_IN_SECU_CHANNEL = 63; // 应答 传输OneTime证书于加密通道, public static final byte E_CTRL_STATUS = 70; // 从未使用 public static final byte E_CTRL_SUBMIT = 71; // E_JCIP_FORM_SUBMIT = 71;//从未使用 // public static final byte E_JCIP_REQUEST = 73;//从未使用 public static final byte E_SOUND = 74; public static final byte E_IMAGE_PNG = 75; public static final byte E_IMAGE_PNG_THUMBNAIL = 76; public static final byte E_SCREEN_SELECT_TXT = 79; public static final byte E_SCREEN_MOVE_UP = 80; public static final byte E_SCREEN_MOVE_LEFT = 81; public static final byte E_SCREEN_MOVE_DOWN = 82; public static final byte E_SCREEN_MOVE_RIGHT = 83; // 由于采用全屏方式,所以不需要向服务器传送 public static final byte E_SCREEN_ZOOM = 84; // CS进行RemoteScreenSize双向通讯,保留旧方法,新的传输见E_TRANS_SERVER_CONFIG public static final byte E_SCREEN_REMOTE_SIZE = 86; public static final byte E_SCREEN_COLOR_MODE = 87; public static final byte E_SCREEN_REFRESH_MILLSECOND = 88; public static final byte E_SCREEN_REFRESH_RECTANGLE = 89; public static final byte E_BIG_MSG_JS_TO_MOBILE = 90; public static final byte E_JS_EVENT_TO_SERVER = 91; public static final byte E_STREAM_MANAGE = 92; public static final byte E_STREAM_DATA = 93; // public static final byte E_JCIP_FORM_REFRESH = 101;//停止使用 public static final byte E_SCREEN_BLOCK_COPY = 102; public static final byte E_LOAD_CACHE = 103; public static final byte E_RESP_CACHE_OK = 104; public static final byte E_CLASS = 126; public static final byte E_PACKAGE_SPLIT_TCP = 127; // 以下段属于UDP_CONTROLLER段专属 public static final byte LEN_UDP_CONTROLLER_HEAD = 2; public static final byte E_UDP_CONTROLLER_TEST_SPEED = 1; public static final byte E_UDP_CONTROLLER_SET_ADDR_NULL = 2; public static final byte DATA_UDP_CONTROLLER_SET_ADDR_NULL_SUCC = 1; public static final byte DATA_UDP_CONTROLLER_SET_ADDR_NULL_NOT_FOUND = 2; public static final byte DATA_PACKET_SPLIT = 'Y'; public static final byte DATA_PACKET_NOT_SPLIT = 'N'; public static final byte DATA_IS_SERVER_TO_RELAY = 's'; public static final byte DATA_IS_CLIENT_TO_RELAY = 'c'; public static final byte DATA_ROOT_UPNP_TEST = 1; public static final byte DATA_ROOT_RESTART = 2; // 专供RootMonitor之用,Root间的连通检测。不能被普通服务器使用 public static final byte DATA_ROOT_LINE_WATCHER_ON_RELAY = 3; public static final byte DATA_ROOT_SAME_ID_IS_USING = 4; public static final byte DATA_ROOT_UDP_PORT_NOTIFY = 5; public static final byte DATA_ROOT_LINE_WATCHER_ON_SERVERING = 6; public static final byte DATA_ROOT_ONLINE_DB_EXEC = 7; public static final byte DATA_ROOT_OS_IN_LOCK = 8; public static final byte DATA_ROOT_SERVER_IN_DIRECT_MODE = 9; public static final byte DATA_E_TAG_RELAY_REG_SUB_FIRST = 0; public static final byte DATA_E_TAG_RELAY_REG_SUB_RESET = 1; public static final byte DATA_SUB_TAG_MSG_MTU_1472 = 1; public static final byte DATA_SUB_TAG_MSG_UDP_CHECK_ALIVE = 2; public static final short LEN_CTRL_TAG = 1; public static final short LEN_CTRL_SUB = 1; public static final short LEN_MSG_LEN_HIGH = 1; public static final short LEN_MSG_LEN_MID = 1; public static final short LEN_MSG_LEN_LOW = 1; public static final short LEN_UDP_HEADER = 2; public static final short LEN_UUID_LEN_STORE = 0; // 存储UUID长度,1个长度,如javalover,则为9 public static final short LEN_MAX_UUID_VALUE = 39; // 注意同步DataNatReqConn内的UUID 39 public static final short LEN_MAX_UUID_UDP_VALUE = 0; // 注意同步DataNatReqConn内的UUID 39 public static final int TCP_PACKAGE_SPLIT_EXT_BUF_SIZE = 1024; public static final int MAX_LEN_TCP_PACKAGE_BLOCK_BUF = 1 << 17; // 128K public static final int MAX_LEN_TCP_PACKAGE_SPLIT = MAX_LEN_TCP_PACKAGE_BLOCK_BUF - TCP_PACKAGE_SPLIT_EXT_BUF_SIZE; public static final short LEN_TCP_PACKAGE_SPLIT_TAG = 1; public static final short LEN_TCP_PACKAGE_SPLIT_SUB_TAG = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_GROUP_ID_HIGH = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_GROUP_ID_MID_HIGH = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_GROUP_ID_MID_LOW = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_GROUP_ID_LOW = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_NUM_HIGH = 1;//分组内的总块数 // public static final short LEN_TCP_PACKAGE_SPLIT_NUM_MID_HIGH = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_NUM_MID_LOW = 1; // public static final short LEN_TCP_PACKAGE_SPLIT_NUM_LOW = 1; public static final short LEN_TCP_PACKAGE_SPLIT_DATA_BLOCK_LEN = 10; // 需要从标准数据块中,切取另用的长度 public static final short LEN_NEED_ACK = 1; // 需要接收确认 public static final short LEN_PACKET_SPLIT = 1; // 分包 public static final short LEN_PACKET_SPLIT_NUM_HIGH = 1; // 分包总数 public static final short LEN_PACKET_SPLIT_NUM_LOW = 1; // 分包总数 public static final short LEN_PACKET_SPLIT_NO_HIGH = 1; // 分包编号 public static final short LEN_PACKET_SPLIT_NO_LOW = 1; // 分包编号 public static final short LEN_MSG_ID_HIGH = 1; // 每条消息的接收确认ID public static final short LEN_MSG_ID_MID = 1; // 每条消息的接收确认ID public static final short LEN_MSG_ID_LOW = 1; // 每条消息的接收确认ID public static final short LEN_MSG_ID_TOTAL_SIZE = 3; // 上述三块总字节长 // 每到65535时,又从0开始 public static final short LEN_GROUP_ID_HIGH = 1; // 每条消息所在Blob组的接收确认ID public static final short LEN_GROUP_ID_LOW = 1; // 每条消息所在Blob组的接收确认ID public static final short LEN_SERVER_ON_RELAY = 1; public static final byte NULL_CTRL_SUB_TAG = (byte) 255; public static final short INDEX_CTRL_TAG = 0; public static final short INDEX_CTRL_SUB_TAG = INDEX_CTRL_TAG + LEN_CTRL_TAG; // 注意:由于sub_tag与msg_len可能合并成大串。参见setBigMsgLen public static final short INDEX_MSG_LEN_HIGH = INDEX_CTRL_SUB_TAG + LEN_CTRL_SUB; // 注意:由于sub_tag与msg_len可能合并成大串。参见setBigMsgLen public static final short INDEX_MSG_LEN_MID = INDEX_MSG_LEN_HIGH + LEN_MSG_LEN_HIGH; public static final short INDEX_MSG_LEN_LOW = INDEX_MSG_LEN_MID + LEN_MSG_LEN_MID; public static final short INDEX_MSG_DATA = INDEX_MSG_LEN_LOW + LEN_MSG_LEN_LOW; // 只含有头标识的消息体,不需要更多内容。但含零长度信息 public static final short MIN_LEN_MSG = INDEX_MSG_DATA; public static final int TCP_SPLIT_STORE_IDX = MsgBuilder.INDEX_MSG_DATA + MsgBuilder.LEN_TCP_PACKAGE_SPLIT_DATA_BLOCK_LEN; public static final int INDEX_TCP_SPLIT_TAG = MsgBuilder.INDEX_MSG_DATA; public static final int INDEX_TCP_SPLIT_SUB_TAG = INDEX_TCP_SPLIT_TAG + LEN_TCP_PACKAGE_SPLIT_TAG; public static final int INDEX_TCP_SPLIT_SUB_GROUP_ID = INDEX_TCP_SPLIT_SUB_TAG + LEN_TCP_PACKAGE_SPLIT_SUB_TAG; public static final int INDEX_TCP_SPLIT_SUB_GROUP_NUM = INDEX_TCP_SPLIT_SUB_GROUP_ID + 4; // 分组内的总块数 /** UDP数组结构区 */ public static final short INDEX_UDP_HEADER = INDEX_MSG_DATA; public static final short INDEX_PACKET_SPLIT = INDEX_UDP_HEADER + LEN_UDP_HEADER; public static final short INDEX_SERVER_ON_RELAY = INDEX_PACKET_SPLIT + LEN_PACKET_SPLIT; // UUID物理最大设计存储字节为39 public static final short INDEX_UUID_LEN = INDEX_SERVER_ON_RELAY + LEN_SERVER_ON_RELAY; public static final short INDEX_UUID_VALUE_START = INDEX_UUID_LEN + LEN_UUID_LEN_STORE; // 值开始的地方,如上为j所在。 public static final short INDEX_NEED_ACK = INDEX_UUID_VALUE_START + LEN_MAX_UUID_UDP_VALUE; public static final short INDEX_PACKET_SPLIT_NUM_HIGH = INDEX_NEED_ACK + LEN_NEED_ACK; public static final short INDEX_PACKET_SPLIT_NUM_LOW = INDEX_PACKET_SPLIT_NUM_HIGH + LEN_PACKET_SPLIT_NUM_HIGH; public static final short INDEX_PACKET_SPLIT_NO_HIGH = INDEX_PACKET_SPLIT_NUM_LOW + LEN_PACKET_SPLIT_NUM_LOW; public static final short INDEX_PACKET_SPLIT_NO_LOW = INDEX_PACKET_SPLIT_NO_HIGH + LEN_PACKET_SPLIT_NO_HIGH; public static final short INDEX_MSG_ID_HIGH = INDEX_PACKET_SPLIT_NO_LOW + LEN_PACKET_SPLIT_NO_LOW; public static final short INDEX_MSG_ID_MID = INDEX_MSG_ID_HIGH + LEN_MSG_ID_HIGH; public static final short INDEX_MSG_ID_LOW = INDEX_MSG_ID_MID + LEN_MSG_ID_MID; public static final short INDEX_GROUP_ID_HIGH = INDEX_MSG_ID_LOW + LEN_MSG_ID_LOW; public static final short INDEX_GROUP_ID_LOW = INDEX_GROUP_ID_HIGH + LEN_GROUP_ID_HIGH; public static final short INDEX_UDP_MSG_DATA = INDEX_GROUP_ID_LOW + LEN_GROUP_ID_LOW; public static final short MIN_UDP_LEN_MSG = INDEX_UDP_MSG_DATA; // public static final int MAX_LEN_UDP_MSG_DATA = UDP_BYTE_SIZE - INDEX_UDP_MSG_DATA; // 结构区所能存放的最大的UDP数据长度,实际可能小于该值,因为从548到1492寻优问题 public static final int UDP_MTU_DATA_MIN_SIZE = UDP_INTERNET_MIN_MSS - INDEX_UDP_MSG_DATA; public static final int UDP_MTU_DATA_MAX_SIZE = UDP_BYTE_SIZE - INDEX_UDP_MSG_DATA; }