Gateway.java
上传用户:kyckim
上传日期:2007-12-11
资源大小:332k
文件大小:20k
源码类别:

通讯/手机编程

开发平台:

Java

  1. package Hiisi;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.util.Calendar;
  6. import java.util.Enumeration;
  7. import java.util.Hashtable;
  8. import javax.microedition.io.Connector;
  9. import javax.microedition.io.HttpConnection;
  10. import javax.microedition.io.ServerSocketConnection;
  11. import javax.microedition.io.SocketConnection;
  12. import javax.microedition.io.StreamConnection;
  13. import javax.microedition.lcdui.Display;
  14. public class Gateway extends Thread {
  15. boolean running = true;
  16. private Calendar cal = null;
  17. private int year = 0;
  18. private String month = null;
  19. private int day_of_month = 0;
  20. private int hour = 0;
  21. private int minute = 0;
  22. private int second = 0;
  23. private ServerSocketConnection ssc = null;
  24. private SocketConnection sc = null;
  25. private DataInputStream input = null;
  26. private DataOutputStream output = null;
  27. private StreamConnection bc = null;
  28. private DataInputStream bluetoothInput = null;
  29. private DataOutputStream bluetoothOutput = null;
  30. private HttpConnection hc = null;
  31. private DataInputStream httpInput = null;
  32. private DataOutputStream httpOutput = null;
  33. private String requestMethod = null;
  34. private String requestURI = null;
  35. private String requestProtocol = null;
  36. private String requestHost = null;
  37. private int requestPort = 80;
  38. private Hashtable requestHeaderField = new Hashtable();
  39. private byte[] postData = null;
  40. private String responseProtocol = null;
  41. private String responseCode = null;
  42. private String responseMessage = null;
  43. private Hashtable responseHeaderField = new Hashtable();
  44. private int byteTranfered = 0;
  45. Gateway() {
  46. }
  47. private void closeBluetooth() {
  48. try{ 
  49. if(bluetoothInput != null) {
  50. bluetoothInput.close();
  51. bluetoothInput=null;
  52. }
  53. } catch(IOException e) {
  54. }
  55. try{ 
  56. if(bluetoothOutput != null) {
  57. bluetoothOutput.close();
  58. bluetoothOutput=null;
  59. }
  60. } catch(IOException e) {
  61. }
  62. try{ 
  63. if(bc != null){
  64. bc.close();
  65. bc = null;
  66. }
  67. } catch(IOException e){
  68. }
  69. }
  70. private void closeHttp() {
  71. try{ 
  72. if(httpInput != null) {
  73. httpInput.close();
  74. httpInput=null;
  75. }
  76. } catch(IOException e) {
  77. }
  78. try{ 
  79. if(httpOutput != null) {
  80. httpOutput.close();
  81. httpOutput=null;
  82. }
  83. } catch(IOException e) {
  84. }
  85. try{ 
  86. if(hc != null){
  87. hc.close();
  88. hc = null;
  89. }
  90. } catch(IOException e){
  91. }
  92. }
  93. private void closeInput() {
  94. try{
  95. if(input != null){
  96. input.close();
  97. input = null;
  98. }
  99. } catch(IOException e) {
  100. }
  101. }
  102. private void closeOutput() {
  103. try{ 
  104. if(output != null){
  105. output.close();
  106. output = null;
  107. }
  108. } catch(IOException e) {
  109. }
  110. }
  111. private void closeSocket() {
  112. try{
  113. if(sc != null){
  114. sc.close();
  115. sc = null;
  116. }
  117. } catch(IOException e) {
  118. }
  119. }
  120. private void closeServerSocket() {
  121. try {
  122. if(ssc != null) {
  123. ssc.close();
  124. ssc = null;
  125. }
  126. } catch(IOException e){
  127. }
  128. }
  129. void exitGateway() {
  130. closeInput();
  131. closeBluetooth();
  132. closeHttp();
  133. closeOutput();
  134. closeSocket();
  135. closeServerSocket();
  136. }
  137. public void run() {
  138. try {
  139. ssc = (ServerSocketConnection)Connector.open("socket://:1234");
  140. } catch(IOException e) {
  141. }
  142. while(running){
  143. HiisiMIDlet.mainForm.log("Hiisi Proxy " + HiisiMIDlet.hiisiMIDlet.settingForm.getGatewayModeString() + " is idling...");
  144. connectingProcess();
  145. }
  146. exitGateway();
  147. }
  148. private void connectingProcess() {
  149. try{
  150. sc = (SocketConnection)ssc.acceptAndOpen();
  151. sc.setSocketOption(SocketConnection.DELAY, 0);
  152. sc.setSocketOption(SocketConnection.LINGER, 0);
  153. sc.setSocketOption(SocketConnection.KEEPALIVE, 0);
  154. sc.setSocketOption(SocketConnection.RCVBUF, 8192);
  155. sc.setSocketOption(SocketConnection.SNDBUF, 8192);
  156. HiisiMIDlet.mainForm.log("Hiisi Proxy " + HiisiMIDlet.hiisiMIDlet.settingForm.getGatewayModeString() + " is running...");
  157. requestMethod = "";
  158. requestURI = "";
  159. requestProtocol = "";
  160. requestHeaderField.clear();
  161. requestHost = "";
  162. requestPort = 80;
  163. input = sc.openDataInputStream();
  164. readRequestHeader();
  165. closeInput();
  166. if(HiisiMIDlet.settingForm.isFilter() && (requestURI.indexOf(HiisiMIDlet.settingForm.getFilterURL()) == -1)) {
  167. requestURI = HiisiMIDlet.settingForm.getFilterURL() + "?_ucb_l=1&_ucb_k=1&_ucb_u=" + requestURI;
  168. output = sc.openDataOutputStream();
  169. output.write(("HTTP/1.1 302 Moved Temporarilyrn").getBytes());
  170. output.write(("Location: " + requestURI + "rnrn").getBytes());
  171. output.flush();
  172. closeOutput();
  173. closeSocket();
  174. return;
  175. }
  176. if(requestURI.indexOf("http://ime.nu/") != -1) {
  177. requestURI = "http://" + requestURI.substring(14);
  178. output = sc.openDataOutputStream();
  179. output.write(("HTTP/1.1 302 Moved Temporarilyrn").getBytes());
  180. output.write(("Location: " + requestURI + "rnrn").getBytes());
  181. output.flush();
  182. closeOutput();
  183. closeSocket();
  184. return;
  185. }
  186. if(HiisiMIDlet.settingForm.getGatewayMode() == HiisiMIDlet.settingForm.BLUETOOTH_MODE) {
  187. bc = (StreamConnection)Connector.open(HiisiMIDlet.bluetoothConnection.getUrl());
  188. bluetoothOutput = bc.openDataOutputStream();
  189. connectViaBluetooth();
  190. } else if (HiisiMIDlet.settingForm.getGatewayMode() == HiisiMIDlet.settingForm.WAP_MODE) {
  191. hc = (HttpConnection)Connector.open(requestURI, 1);
  192. ConnectViaWap();
  193. }
  194. responseProtocol = "";
  195. responseCode = "";
  196. responseMessage = "";
  197. responseHeaderField.clear();
  198. byteTranfered = 0;
  199. if(HiisiMIDlet.settingForm.getGatewayMode() == HiisiMIDlet.settingForm.BLUETOOTH_MODE) {
  200. bluetoothInput = bc.openDataInputStream();
  201. readResponseHeaderViaBluetooth();
  202. output = sc.openDataOutputStream();
  203. writeResponseFromBluetooth();
  204. closeBluetooth();
  205. } else if(HiisiMIDlet.settingForm.getGatewayMode() == HiisiMIDlet.settingForm.WAP_MODE) {
  206. httpInput = hc.openDataInputStream();
  207. readResponseHeaderViaWap();
  208. output = sc.openDataOutputStream();
  209. writeResponseFromWap();
  210. closeHttp();
  211. }
  212. HiisiMIDlet.logForm.totalLog(HiisiMIDlet.logForm.getSentByte(), HiisiMIDlet.logForm.getRecvdByte());
  213. HiisiMIDlet.logForm.log("localhost - - [" + getAccessTime()+ "] "" +
  214. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered + "n");
  215. closeOutput();
  216. closeSocket();
  217. } catch(IOException e) {
  218. // HiisiMIDlet.mainForm.log(e);
  219. } catch(InterruptedException e) {
  220. // HiisiMIDlet.mainForm.log(e);
  221. } finally{
  222. closeInput();
  223. closeBluetooth();
  224. closeHttp();
  225. closeOutput();
  226. closeSocket();
  227. }
  228. }
  229. private void readRequestHeader() throws IOException {
  230. StringBuffer sb = new StringBuffer();
  231. int c;
  232. int line = 0;
  233. while((c = input.read()) != -1){
  234. if((char)c == 'r') {
  235. if(sb.length() == 0) {
  236. break;
  237. } else {
  238. processRequestHeader(sb.toString(), line);
  239. sb.delete(0, sb.length());
  240. line++;
  241. }
  242. } else if((char)c == 'n') {
  243. } else {
  244. sb.append((char)c);
  245. }
  246. }
  247. sb = null;
  248. if(requestMethod.equals("POST")) {
  249. int dummy = input.read();
  250. if(requestHeaderField.get("content-length") != null) {
  251. int contentLength = Integer.valueOf((String)requestHeaderField.get("content-length")).intValue();
  252. postData = new byte[contentLength];
  253. input.read(postData, 0, contentLength);
  254. HiisiMIDlet.logForm.addSentByte(contentLength);
  255. }
  256. }
  257. }
  258. private void processRequestHeader(String str, int line) throws IOException {
  259. str = str.trim();
  260. if(line == 0){
  261. int delimitPos = str.indexOf(' ');
  262. requestMethod = (str.substring(0, delimitPos)).trim();
  263. str = (str.substring(delimitPos + 1)).trim();
  264. delimitPos = str.indexOf(' ');
  265. requestURI = (str.substring(0, delimitPos)).trim();
  266. requestProtocol = (str.substring(delimitPos + 1)).trim();
  267. } else {
  268. int delimitPos = str.indexOf(':');
  269. String key = ((str.substring(0, delimitPos)).trim()).toLowerCase();
  270. String value = (str.substring(delimitPos + 1)).trim();
  271. if(key.equals("host")) {
  272. delimitPos = value.indexOf(':');
  273. if(delimitPos == -1) {
  274. requestHost = value;
  275. } else {
  276. requestHost = value.substring(0, delimitPos);
  277. requestPort = Integer.valueOf(value.substring(delimitPos + 1)).intValue();
  278. }
  279. }
  280. requestHeaderField.put(key, value);
  281. }
  282. }
  283. private void connectViaBluetooth() throws IOException {
  284. String ua = "";
  285. String wap = "";
  286. if(HiisiMIDlet.settingForm.getUaId() == 0) {
  287. ua = HiisiMIDlet.hiisiMIDlet.getAppProperty("User-Agent");
  288. wap = HiisiMIDlet.hiisiMIDlet.getAppProperty("x-wap-profile");
  289. } else if(HiisiMIDlet.settingForm.getUaId() == 1) ua = HiisiMIDlet.hiisiMIDlet.getAppProperty("User-Agent2");
  290. else if(HiisiMIDlet.settingForm.getUaId() == 2) ua = HiisiMIDlet.hiisiMIDlet.getAppProperty("User-Agent3");
  291. bluetoothOutput.write((requestMethod + " " + requestURI + " " + requestProtocol + "rn").getBytes());
  292. HiisiMIDlet.logForm.addSentByte((requestMethod + " " + requestURI + " " + requestProtocol + "rn").length());
  293. Enumeration e = requestHeaderField.keys();
  294. String key;
  295. String value;
  296. while (e.hasMoreElements()){
  297. key = (String)e.nextElement();
  298. value = (String)requestHeaderField.get(key);
  299. if(!key.equals("user-agent") && !key.equals("x-wap-profile") && !key.equals("host") && !key.equals("connection")) {
  300. bluetoothOutput.write((key + ": " + value+"rn").getBytes());
  301. HiisiMIDlet.logForm.addSentByte((key + ": " + value+"rn").length());
  302. }
  303. }
  304. if(!ua.equals("")) {
  305. bluetoothOutput.write(("user-agent: " +  ua +"rn").getBytes());
  306. HiisiMIDlet.logForm.addSentByte(("user-agent: " +  ua +"rn").length());
  307. }
  308. if(!wap.equals("")) {
  309. bluetoothOutput.write(("x-wap-profile: " +  wap +"rn").getBytes());
  310. HiisiMIDlet.logForm.addSentByte(("x-wap-profile: " +  wap +"rn").length());
  311. }
  312. if(requestPort == 80) {
  313. bluetoothOutput.write(("host: " + requestHost + "rn").getBytes());
  314. HiisiMIDlet.logForm.addSentByte(("host: " + requestHost + "rn").length());
  315. } else {
  316. bluetoothOutput.write(("host: " + requestHost + ":" + requestPort + "rn").getBytes());
  317. HiisiMIDlet.logForm.addSentByte(("host: " + requestHost + ":" + requestPort + "rn").length());
  318. }
  319. bluetoothOutput.write("connection: closernrn".getBytes());
  320. HiisiMIDlet.logForm.addSentByte("connection: closernrn".length());
  321. if(requestMethod.equals("POST")) {
  322. bluetoothOutput.write(postData);
  323. postData = null;
  324. }
  325. bluetoothOutput.flush();
  326. }
  327. private void ConnectViaWap() throws IOException {
  328. String UA = HiisiMIDlet.hiisiMIDlet.getAppProperty("User-Agent") + "n";
  329. String WAP = HiisiMIDlet.hiisiMIDlet.getAppProperty("x-wap-profile");
  330. hc.setRequestMethod(requestMethod);
  331. HiisiMIDlet.logForm.addSentByte((requestMethod + " " + requestURI + " " + requestProtocol + "rn").length());
  332. Enumeration e = requestHeaderField.keys();
  333. String key;
  334. String value;
  335. while (e.hasMoreElements()){
  336. key = (String)e.nextElement();
  337. value = (String)requestHeaderField.get(key);
  338. if(!key.equals("user-agent") && !key.equals("x-wap-profile") && !key.equals("host") && !key.equals("connection")) {
  339. hc.setRequestProperty(key, value);
  340. HiisiMIDlet.logForm.addSentByte((key + ": " + value + "rn").length());
  341. }
  342. }
  343. if(!UA.equals("")) {
  344. hc.setRequestProperty("user-agent", UA);
  345. HiisiMIDlet.logForm.addSentByte(("user-agent: " + UA + "rn").length());
  346. }
  347. if(!WAP.equals("")) {
  348. hc.setRequestProperty("x-wap-profile", WAP);
  349. HiisiMIDlet.logForm.addSentByte(("x-wap-profile: " + WAP + "rn").length());
  350. }
  351. if(requestPort == 80) {
  352. hc.setRequestProperty("host", requestHost);
  353. HiisiMIDlet.logForm.addSentByte(("host: " + requestHost + "rn").length());
  354. } else {
  355. hc.setRequestProperty("host", requestHost + ":" + requestPort);
  356. HiisiMIDlet.logForm.addSentByte(("host: " + requestHost + ":" + requestPort + "rn").length());
  357. }
  358. hc.setRequestProperty("connection", "close");
  359. HiisiMIDlet.logForm.addSentByte("connection: closernrn".length());
  360. if(requestMethod.equals("POST")) {
  361. httpOutput = hc.openDataOutputStream();
  362. httpOutput.write(postData);
  363. HiisiMIDlet.logForm.addSentByte(postData.length);
  364. httpOutput.flush();
  365. postData = null;
  366. }
  367. }
  368. private void readResponseHeaderViaBluetooth() throws IOException, InterruptedException {
  369. StringBuffer sb = new StringBuffer();
  370. int c;
  371. int line = 0;
  372. while(true){
  373. if((c = readbuffer(bluetoothInput, 300)) == -1) {
  374. responseProtocol = "HTTP/1.1";
  375. responseCode = "504";
  376. responseMessage = "Gateway Time-out";
  377. break;
  378. } else {
  379. if((char)c == 'r') {
  380. if(sb.length() == 0) {
  381. break;
  382. } else {
  383. processResponseHeader(sb.toString(), line);
  384. sb.delete(0, sb.length());
  385. line++;
  386. }
  387. } else if((char)c == 'n') {
  388. } else {
  389. sb.append((char)c);
  390. }
  391. }
  392. }
  393. sb = null;
  394. }
  395. private void processResponseHeader(String str, int line) throws IOException {
  396. str = str.trim();
  397. if(line == 0){
  398. int delimitPos = str.indexOf(' ');
  399. responseProtocol = (str.substring(0, delimitPos)).trim();
  400. str = (str.substring(delimitPos + 1)).trim();
  401. delimitPos = str.indexOf(' ');
  402. responseCode = (str.substring(0, delimitPos)).trim();
  403. responseMessage = (str.substring(delimitPos + 1)).trim();
  404. } else {
  405. int delimitPos = str.indexOf(':');
  406. String key = ((str.substring(0, delimitPos)).trim()).toLowerCase();
  407. String value = (str.substring(delimitPos + 1)).trim();
  408. responseHeaderField.put(key, value);
  409. }
  410. }
  411. private void writeResponseFromBluetooth() throws IOException, InterruptedException {
  412. output.write((responseProtocol + " " + responseCode + " " + responseMessage + "rn").getBytes());
  413. HiisiMIDlet.logForm.addRecvdByte((responseProtocol + " " + responseCode + " " + responseMessage + "rn").length());
  414. Enumeration e = responseHeaderField.keys();
  415. String key;
  416. String value;
  417. while (e.hasMoreElements()){
  418. key = (String)e.nextElement();
  419. value = (String)responseHeaderField.get(key);
  420. if(!key.equals("connection")) {
  421. output.write((key + ": " + value+"rn").getBytes());
  422. HiisiMIDlet.logForm.addRecvdByte((key + ": " + value+"rn").length());
  423. }
  424. }
  425. output.write("connection: closernrn".getBytes());
  426. HiisiMIDlet.logForm.addRecvdByte("connection: closernrn".length());
  427. if(!requestMethod.equals("HEAD")) {
  428. int dummy;
  429. if((dummy = readbuffer(bluetoothInput,100)) == -1) return;
  430. int b;
  431. if(responseHeaderField.get("content-length") != null) {
  432. int contentLength = Integer.valueOf((String)responseHeaderField.get("content-length")).intValue();
  433. int temp = 0;
  434. int read = 0 ;
  435. byte[] buf = new byte[4096];
  436. while ((read < contentLength) && (temp != -1)) {
  437. temp = readbuffer(bluetoothInput, buf, 4096, 300);
  438. if(temp != -1) {
  439. output.write(buf, 0, temp);
  440. read += temp;
  441. byteTranfered += temp;
  442. HiisiMIDlet.logForm.addRecvdByte(temp);
  443. }
  444. }
  445. buf = null;
  446. } else {
  447. byte[] buf = new byte[4096];
  448. while(true) {
  449. if((b = readbuffer(bluetoothInput, buf, 4096, 5)) == -1) {
  450. break;
  451. } else {
  452. output.write(buf, 0, b);
  453. byteTranfered += b;
  454. HiisiMIDlet.logForm.addRecvdByte(b);
  455. }
  456. }
  457. buf = null;
  458. }
  459. }
  460. output.flush();
  461. }
  462. private void readResponseHeaderViaWap() throws IOException {
  463. responseProtocol = "HTTP/1.1";
  464. responseCode = Integer.toString(hc.getResponseCode());
  465. responseMessage = hc.getResponseMessage();
  466. String key = "";
  467. for(int i = 0; ((key = hc.getHeaderFieldKey(i)) != null); i++){
  468. responseHeaderField.put(key, hc.getHeaderField(i));
  469. }
  470. }
  471. private void writeResponseFromWap() throws IOException {
  472. output.write((responseProtocol + " " + responseCode + " " + responseMessage + "rn").getBytes());
  473. HiisiMIDlet.logForm.addRecvdByte((responseProtocol + " " + responseCode + " " + responseMessage + "rn").length());
  474. Enumeration e = responseHeaderField.keys();
  475. String key;
  476. String value;
  477. while (e.hasMoreElements()){
  478. key = (String)e.nextElement();
  479. value = (String)responseHeaderField.get(key);
  480. if(!key.equals("connection")) {
  481. output.write((key + ": " + value+"rn").getBytes());
  482. HiisiMIDlet.logForm.addRecvdByte((key + ": " + value+"rn").length());
  483. }
  484. }
  485. output.write("connection: closernrn".getBytes());
  486. HiisiMIDlet.logForm.addRecvdByte("connection: closernrn".length());
  487. int contentLength = (int)hc.getLength();
  488. int temp = 0;
  489. int read = 0 ;
  490. byte[] buf = new byte[4096];
  491. while ((read < contentLength) && (temp != -1)) {
  492. temp = httpInput.read(buf, 0, 4096);
  493. if(temp != -1) {
  494. output.write(buf, 0, temp);
  495. read += temp;
  496. byteTranfered += temp;
  497. HiisiMIDlet.logForm.addRecvdByte(temp);
  498. }
  499. }
  500. output.flush();
  501. buf = null;
  502. }
  503. private String getAccessTime() {
  504. cal = Calendar.getInstance();
  505. year = cal.get(Calendar.YEAR);
  506. switch(cal.get(Calendar.MONTH) + 1) {
  507. case 1: month = "Jan"; break;
  508. case 2: month = "Feb"; break;
  509. case 3: month = "Mar"; break;
  510. case 4: month = "Apr"; break;
  511. case 5: month = "May"; break;
  512. case 6: month = "Jun"; break;
  513. case 7: month = "Jul"; break;
  514. case 8: month = "Aug"; break;
  515. case 9: month = "Sep"; break;
  516. case 10: month = "Oct"; break;
  517. case 11: month = "Nov"; break;
  518. case 12: month = "Dec"; break;
  519. }
  520. day_of_month = cal.get(Calendar.DAY_OF_MONTH);
  521. hour = cal.get(Calendar.HOUR_OF_DAY);
  522. minute = cal.get(Calendar.MINUTE);
  523. second = cal.get(Calendar.SECOND);
  524. return formatNum(day_of_month) + "/" + month + "/" + year +
  525. ":" + formatNum(hour) + ":" + formatNum(minute) + ":" + formatNum(second) + " +0900";
  526. }
  527. private String formatNum(int num) {
  528. if(num < 10) return "0" + num;
  529. else return "" + num;
  530. }
  531. private static int readbuffer(DataInputStream stream,  int reread) throws IOException, InterruptedException {
  532. int c = -1;
  533. for(int i = 0; i < reread; i++) {
  534. if(stream.available() != 0) {
  535. c = stream.read();
  536. break;
  537. }
  538. Thread.sleep(100);
  539. }
  540. return c;
  541. }
  542. private static int readbuffer(DataInputStream stream,  byte[] buf, int len, int reread) throws IOException, InterruptedException {
  543. int c = -1;
  544. for(int i = 0; i < reread; i++) {
  545. if(stream.available() != 0) {
  546. c = stream.read(buf, 0, len);
  547. break;
  548. }
  549. Thread.sleep(100);
  550. }
  551. return c;
  552. }
  553. void checkConnection() {
  554. Thread check = new Thread() {
  555. public void run() {
  556. try {
  557. Display.getDisplay(HiisiMIDlet.hiisiMIDlet).setCurrent(HiisiMIDlet.mainForm);
  558. HiisiMIDlet.mainForm.log("Checking bluetooth connection...");
  559. bc = (StreamConnection)Connector.open(HiisiMIDlet.bluetoothConnection.getUrl());
  560. bluetoothOutput = bc.openDataOutputStream();
  561. bluetoothOutput.write("r".getBytes());
  562. HiisiMIDlet.mainForm.log("Bluetooth connection is available.nHiisi Proxy "
  563. + HiisiMIDlet.hiisiMIDlet.settingForm.getGatewayModeString()
  564. + " is idling...");
  565. if(bc != null) {
  566. bc.close();
  567. bc = null;
  568. }
  569. if(bluetoothOutput != null) {
  570. bluetoothOutput.close();
  571. bluetoothOutput = null;
  572. }
  573. } catch(IOException e) {
  574. HiisiMIDlet.mainForm.log("Bluetooth connection is not available.nHiisi Proxy "
  575. + HiisiMIDlet.hiisiMIDlet.settingForm.getGatewayModeString()
  576. + " is idling...");
  577. }
  578. }
  579. };
  580. check.start();
  581. }
  582. }