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

通讯/手机编程

开发平台:

Java

  1. package Pihatonttu;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.net.HttpURLConnection;
  6. import java.net.MalformedURLException;
  7. import java.net.ProtocolException;
  8. import java.net.SocketTimeoutException;
  9. import java.net.Socket;
  10. import java.net.UnknownHostException;
  11. import java.net.URL;
  12. import java.util.Calendar;
  13. import java.util.Enumeration;
  14. import java.util.Hashtable;
  15. import java.util.TooManyListenersException;
  16. import javax.comm.CommPortIdentifier;
  17. import javax.comm.NoSuchPortException;
  18. import javax.comm.PortInUseException;
  19. import javax.comm.SerialPort;
  20. import javax.comm.SerialPortEvent;
  21. import javax.comm.SerialPortEventListener;
  22. import javax.comm.UnsupportedCommOperationException;
  23. public class Server implements Runnable, SerialPortEventListener {
  24. private SerialPort comPort;
  25. private Calendar cal = null;
  26. private int year = 0;
  27. private String month = null;
  28. private int day_of_month = 0;
  29. private int hour = 0;
  30. private int minute = 0;
  31. private int second = 0;
  32. private String accessTime = null;
  33. private DataInputStream comReader;
  34. private DataOutputStream comWriter;
  35. private HttpURLConnection hc = null;
  36. private Socket socket = null;
  37. private DataInputStream reader;
  38. private DataOutputStream writer;
  39. private String requestMethod = null;
  40. private String requestURI = null;
  41. private String requestProtocol = null;
  42. private String requestHost = null;
  43. private int requestPort = 80;
  44. private Hashtable<String, String> requestHeaderField = new Hashtable<String, String>();
  45. private byte[] postData = null;
  46. private String responseProtocol = null;
  47. private String responseCode = null;
  48. private String responseMessage = null;
  49. private int byteTranfered = 0;
  50. private String host = null;
  51. private int port = 80;
  52. Server(String com, String proxy){
  53. CommPortIdentifier portID = null;
  54. try{
  55. portID = CommPortIdentifier.getPortIdentifier(com);
  56. }catch(NoSuchPortException e){
  57. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot find COM port.");
  58. System.exit(1);
  59. }
  60. try{
  61. comPort = (SerialPort)portID.open("Pihatonttu", 5000);
  62. }catch(PortInUseException e){
  63. Pihatonttu.PihatonttuMain.showErrorDialog("COM port is in use.");
  64. System.exit(1);
  65. }
  66. try {
  67. comPort.setSerialPortParams(460800, //9600?115200?230400?460800?921600?
  68. SerialPort.DATABITS_8,
  69. SerialPort.STOPBITS_1,
  70. SerialPort.PARITY_NONE);
  71. comPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
  72. } catch (UnsupportedCommOperationException e){
  73. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot configure COM port.");
  74. System.exit(1);
  75. }
  76. try {
  77. comPort.addEventListener(this);
  78. } catch(TooManyListenersException ex) {
  79. Pihatonttu.PihatonttuMain.showErrorDialog("COM port error.");
  80. System.exit(1);
  81. }
  82. comPort.notifyOnDataAvailable(true);
  83. if(!proxy.equals("null")) {
  84. int delimitPos = proxy.indexOf(':');
  85. host = proxy.substring(0, delimitPos);
  86. port = Integer.valueOf(proxy.substring(delimitPos + 1)).intValue();
  87. }
  88. }
  89. private void closeCOM(){
  90. try{
  91. if(comReader != null){
  92. comReader.close();
  93. comReader = null;
  94. }
  95. } catch(IOException e) {
  96. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot close input/output stream.");
  97. }
  98. try{ 
  99. if(comWriter != null){
  100. comWriter.close();
  101. comWriter = null;
  102. }
  103. } catch(IOException e) {
  104. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot close input/output stream.");
  105. }
  106. }
  107. private void closeHttp() {
  108. try{
  109. if(reader != null){
  110. reader.close();
  111. reader = null;
  112. }
  113. } catch(IOException e) {
  114. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot close input/output stream.");
  115. }
  116. try{ 
  117. if(writer != null){
  118. writer.close();
  119. writer = null;
  120. }
  121. } catch(IOException e) {
  122. Pihatonttu.PihatonttuMain.showErrorDialog("Cannnot close input/output stream.");
  123. }
  124. if(hc != null){
  125. hc.disconnect();
  126. hc = null;
  127. }
  128. }
  129. private void closeCOMPort(){
  130. if(comPort != null) {
  131. comPort.close();
  132. comPort = null;
  133. }
  134. }
  135. public void exitServer() {
  136. closeCOM();
  137. closeHttp();
  138. closeCOMPort();
  139. }
  140. public void serialEvent(SerialPortEvent event) throws MalformedURLException, ProtocolException {
  141. switch(event.getEventType()) {
  142. case SerialPortEvent.BI:
  143. case SerialPortEvent.OE:
  144. case SerialPortEvent.FE:
  145. case SerialPortEvent.PE:
  146. case SerialPortEvent.CD:
  147. case SerialPortEvent.CTS:
  148. case SerialPortEvent.DSR:
  149. case SerialPortEvent.RI:
  150. case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
  151.   break;
  152. case SerialPortEvent.DATA_AVAILABLE:
  153. try {
  154. Pihatonttu.PihatonttuMain.togleIcon(true);
  155. comReader = new DataInputStream(comPort.getInputStream());
  156. comWriter = new DataOutputStream(comPort.getOutputStream());
  157. requestMethod = "";
  158. requestURI = "";
  159. requestProtocol = "";
  160. requestHeaderField.clear();
  161. requestHost = "";
  162. requestPort = 80;
  163. readRequestHeader();
  164. if(!requestMethod.equals("")) {
  165. // loadPage();
  166. accessTime = getAccessTime();
  167. Pihatonttu.PihatonttuMain.logFrame.addElement("localhost - - [" + getAccessTime()+ "] "" +
  168. requestMethod + " " + requestURI + " " + requestProtocol + """);
  169. // if(!requestProtocol.equals("RTSP/1.0")) {
  170. sendRequest();
  171. responseProtocol = "";
  172. responseCode = "";
  173. responseMessage = "";
  174. byteTranfered = 0;
  175. readResponseHeader();
  176. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  177. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode);
  178. forwardResponse();
  179. if(responseCode.startsWith("30")) {
  180. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  181. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " -");
  182. } else {
  183. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  184. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  185. }
  186. // } else {
  187. // sendStreamingRequest();
  188. // readStreamingResponse();
  189. // }
  190. }
  191. } catch(UnknownHostException e){
  192. returnUnknownHostException(comWriter);
  193. } catch(SocketTimeoutException e){
  194. returnUnknownHostException(comWriter);
  195. } catch (IOException e){
  196. if(e.getMessage().indexOf("unknown protocol") != -1) returnUnknownProtocolException(comWriter);
  197. else returnInternalServerException(comWriter);
  198. } finally {
  199. closeCOM();
  200. closeHttp();
  201. Pihatonttu.PihatonttuMain.togleIcon(false);
  202. }
  203. break;
  204. }
  205. }
  206. public void start(){
  207. Thread thread = new Thread(this);
  208. thread.start();
  209. }
  210. public void run(){
  211. String buffer = null;
  212. System.out.flush();
  213. }
  214. private void readRequestHeader() throws IOException {
  215. StringBuffer sb = new StringBuffer();
  216. int c;
  217. int line = 0;
  218. while((c = comReader.read()) != -1) {
  219. if((char)c == 'r') {
  220. if(sb.length() == 0) {
  221. break;
  222. } else {
  223. processRequestHeader(sb.toString(), line);
  224. sb.delete(0, sb.length());
  225. line++;
  226. }
  227. } else if((char)c == 'n') {
  228. } else {
  229. sb.append((char)c);
  230. }
  231. }
  232. sb = null;
  233. if(requestMethod.equals("POST")) {
  234. int dummy = comReader.read();
  235. if(requestHeaderField.get("content-length") != null) {
  236. int contentLength = Integer.valueOf((String)requestHeaderField.get("content-length")).intValue();
  237. postData = new byte[contentLength];
  238. comReader.read(postData, 0, contentLength);
  239. }
  240. }
  241. }
  242. private void processRequestHeader(String str, int line) throws IOException {
  243. str = str.trim();
  244. if(line == 0){
  245. int delimitPos = str.indexOf(' ');
  246. requestMethod = (str.substring(0, delimitPos)).trim();
  247. str = (str.substring(delimitPos + 1)).trim();
  248. delimitPos = str.indexOf(' ');
  249. requestURI = (str.substring(0, delimitPos)).trim();
  250. requestProtocol = (str.substring(delimitPos + 1)).trim();
  251. } else {
  252. int delimitPos = str.indexOf(':');
  253. String key = ((str.substring(0, delimitPos)).trim()).toLowerCase();
  254. String value = (str.substring(delimitPos + 1)).trim();
  255. if(key.equals("host")) {
  256. delimitPos = value.indexOf(':');
  257. if(delimitPos == -1) {
  258. requestHost = value;
  259. } else {
  260. requestHost = value.substring(0, delimitPos);
  261. requestPort = Integer.valueOf(value.substring(delimitPos + 1)).intValue();
  262. }
  263. }
  264. requestHeaderField.put(key, value);
  265. }
  266. }
  267. private void sendRequest() throws MalformedURLException, ProtocolException, IOException {
  268. URL url;
  269. if(host != null) {
  270. url = new URL("http", host, port, requestURI);
  271. } else {
  272. url = new URL(requestURI);
  273. }
  274. hc = (HttpURLConnection)url.openConnection();
  275. hc.setConnectTimeout(30 * 1000);
  276. hc.setReadTimeout(30 * 1000);
  277. hc.setRequestMethod(requestMethod);
  278. Enumeration e = requestHeaderField.keys();
  279. String key;
  280. String value;
  281. while (e.hasMoreElements()){
  282. key = (String)e.nextElement();
  283. value = (String)requestHeaderField.get(key);
  284. hc.setRequestProperty(key, value);
  285. // Pihatonttu.PihatonttuMain.logFrame.addElement(key +": " + value);
  286. }
  287. if(requestMethod.equals("POST")) {
  288. hc.setDoOutput(true);
  289. hc.connect();
  290. writer = new DataOutputStream(hc.getOutputStream());
  291. writer.write(postData);
  292. writer.flush();
  293. postData = null;
  294. } else {
  295. hc.connect();
  296. }
  297. }
  298. private void readResponseHeader() throws IOException {
  299. reader = new DataInputStream(hc.getInputStream());
  300. responseProtocol = "HTTP/1.1";
  301. responseCode = Integer.toString(hc.getResponseCode());
  302. responseMessage = hc.getResponseMessage();
  303. comWriter.write((responseProtocol + " " + responseCode + " " + responseMessage + "rn").getBytes());
  304. String key;
  305. for(int i = 1; ((key = hc.getHeaderFieldKey(i)) != null); i++){
  306. if(!key.equalsIgnoreCase("Transfer-Encoding")) {
  307. comWriter.write((key + ": " + hc.getHeaderField(i) +"rn").getBytes());
  308. // Pihatonttu.PihatonttuMain.logFrame.addElement(key + ": " + hc.getHeaderField(i));
  309. }
  310. }
  311. comWriter.write("rn".getBytes());
  312. }
  313. private void forwardResponse() throws IOException {
  314. int contentLength = (int)hc.getContentLength();
  315. if(contentLength > 0) {
  316. int temp = 0;
  317. int read = 0 ;
  318. byte[] buf = new byte[2048];
  319. while ((read < contentLength) && (temp != -1)) {
  320. temp = reader.read(buf, 0, 2048);
  321. if(temp != -1) {
  322. comWriter.write(buf, 0, temp);
  323. read += temp;
  324. byteTranfered += temp;
  325. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  326. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  327. }
  328. }
  329. buf = null;
  330. } else {
  331. byte[] buf = new byte[2048];
  332. int len = -1;
  333. while(true) {
  334. if((len = reader.read(buf, 0, 2048)) == -1) {
  335. break;
  336. } else {
  337. comWriter.write(buf, 0, len);
  338. byteTranfered += len;
  339. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  340. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  341. }
  342. }
  343. buf = null;
  344. }
  345. comWriter.flush();
  346. }
  347. private void sendStreamingRequest() throws IOException{
  348. int delimitPos = requestURI.lastIndexOf(':');
  349. if(delimitPos == -1) {
  350. requestHost = requestURI;
  351. requestPort = 554;
  352. } else {
  353. requestHost = requestURI.substring(7, delimitPos);
  354. requestPort = Integer.valueOf(requestURI.substring(delimitPos + 1)).intValue();
  355. }
  356. socket = new Socket(requestHost, requestPort);
  357. writer = new DataOutputStream(socket.getOutputStream());
  358. writer.write((requestMethod + " " + requestURI + " " + requestProtocol + "rn").getBytes());
  359. Enumeration e = requestHeaderField.keys();
  360. String key;
  361. String value;
  362. while (e.hasMoreElements()){
  363. key = (String)e.nextElement();
  364. value = (String)requestHeaderField.get(key);
  365. if(!key.equals("connection") && !key.equals("host")) {
  366. writer.write((key + ": " + value + "rn").getBytes());
  367. }
  368. }
  369. writer.write("rn".getBytes());
  370. writer.flush();
  371. }
  372. private void readStreamingResponse() throws IOException{
  373. reader = new DataInputStream(socket.getInputStream());
  374. StringBuffer sb = new StringBuffer();
  375. int c;
  376. int line = 0;
  377. while((c = readbuffer(reader, 10)) != -1) {
  378. if((char)c == 'r') {
  379. if(sb.length() == 0) {
  380. break;
  381. } else {
  382. // Pihatonttu.PihatonttuMain.logFrame.addElement(sb.toString());
  383. comWriter.write((sb.toString() + "rn").getBytes() );
  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. sb = null;
  393. comWriter.write("rn".getBytes());
  394. comWriter.flush();
  395. }
  396. private void returnUnknownHostException(DataOutputStream output) {
  397. try {
  398. output.write("HTTP/1.1 504 Gateway Timeoutrn".getBytes());
  399. output.write("Content-Type: text/htmlrnrn".getBytes());
  400. output.write("<html>".getBytes());
  401. output.write("<head><title>Problem loading page</title></head>".getBytes());
  402. output.write("<body>".getBytes());
  403. output.write("<h1>Server not found</h1>".getBytes());
  404. output.write(("<p>Pihatonttu Proxy can't find the server at "+ requestHost + ".</p>").getBytes());
  405. output.write("</body>".getBytes());
  406. output.write("</html>".getBytes());
  407. output.flush();
  408. } catch(IOException e) {
  409. Pihatonttu.PihatonttuMain.showErrorDialog("Bluetooth connnection is not available.");
  410. } finally {
  411. responseProtocol = "HTTP/1.1";
  412. responseCode = "504";
  413. responseMessage = "Gateway Timeout";
  414. byteTranfered = 0;
  415. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  416. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  417. }
  418. }
  419. private void returnInternalServerException(DataOutputStream output) {
  420. try {
  421. if(byteTranfered == 0) {
  422. output.write("HTTP/1.1 500 Internal Server Errorrn".getBytes());
  423. output.write("Content-Type: text/htmlrnrn".getBytes());
  424. output.write("<html>".getBytes());
  425. output.write("<head><title>Problem loading page</title></head>".getBytes());
  426. output.write("<body>".getBytes());
  427. output.write("<h1>500 Internal Server Error</h1>".getBytes());
  428. output.write(("<p>Pihatonttu Proxy encountered an internal error.</p>").getBytes());
  429. output.write("</body>".getBytes());
  430. output.write("</html>".getBytes());
  431. output.flush();
  432. }
  433. } catch(IOException e) {
  434. Pihatonttu.PihatonttuMain.showErrorDialog("Bluetooth connnection is not available.");
  435. } finally {
  436. responseProtocol = "HTTP/1.1";
  437. responseCode = "500";
  438. responseMessage = "Internal Server Error";
  439. // byteTranfered = 0;
  440. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  441. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  442. }
  443. }
  444. private void returnUnknownProtocolException(DataOutputStream output) {
  445. try {
  446. output.write("HTTP/1.1 501 Not Implementedrn".getBytes());
  447. output.write("Content-Type: text/htmlrnrn".getBytes());
  448. output.write("<html>".getBytes());
  449. output.write("<head><title>Problem loading page</title></head>".getBytes());
  450. output.write("<body>".getBytes());
  451. output.write("<h1>Protocol not supported</h1>".getBytes());
  452. output.write(("<p>Pihatonttu Proxy can't support requested protocol.</p>").getBytes());
  453. output.write("</body>".getBytes());
  454. output.write("</html>".getBytes());
  455. output.flush();
  456. } catch(IOException e) {
  457. Pihatonttu.PihatonttuMain.showErrorDialog("Bluetooth connnection is not available.");
  458. } finally {
  459. responseProtocol = "HTTP/1.1";
  460. responseCode = "501";
  461. responseMessage = "Not Implemented";
  462. byteTranfered = 0;
  463. Pihatonttu.PihatonttuMain.logFrame.addElementFraction("localhost - - [" + accessTime + "] "" +
  464. requestMethod + " " + requestURI + " " + requestProtocol + "" " + responseCode + " " + byteTranfered);
  465. }
  466. }
  467. private String getAccessTime() {
  468. cal = Calendar.getInstance();
  469. year = cal.get(Calendar.YEAR);
  470. switch(cal.get(Calendar.MONTH) + 1) {
  471. case 1: month = "Jan"; break;
  472. case 2: month = "Feb"; break;
  473. case 3: month = "Mar"; break;
  474. case 4: month = "Apr"; break;
  475. case 5: month = "May"; break;
  476. case 6: month = "Jun"; break;
  477. case 7: month = "Jul"; break;
  478. case 8: month = "Aug"; break;
  479. case 9: month = "Sep"; break;
  480. case 10: month = "Oct"; break;
  481. case 11: month = "Nov"; break;
  482. case 12: month = "Dec"; break;
  483. }
  484. day_of_month = cal.get(Calendar.DAY_OF_MONTH);
  485. hour = cal.get(Calendar.HOUR_OF_DAY);
  486. minute = cal.get(Calendar.MINUTE);
  487. second = cal.get(Calendar.SECOND);
  488. return formatNum(day_of_month) + "/" + month + "/" + year +
  489. ":" + formatNum(hour) + ":" + formatNum(minute) + ":" + formatNum(second) + " +0900";
  490. }
  491. private String formatNum(int num) {
  492. if(num < 10) return "0" + num;
  493. else return "" + num;
  494. }
  495. private static int readbuffer(DataInputStream stream,  int reread) throws IOException {
  496. int c = -1;
  497. for(int i = 0; i < reread; i++) {
  498. if(stream.available() != 0) {
  499. c = stream.read();
  500. break;
  501. }
  502. try {
  503. Thread.sleep(100);
  504. } catch(InterruptedException e) {
  505. }
  506. }
  507. return c;
  508. }
  509. private static int readbuffer(DataInputStream stream,  byte[] buf, int len, int reread) throws IOException {
  510. int c = -1;
  511. for(int i = 0; i < reread; i++) {
  512. if(stream.available() != 0) {
  513. c = stream.read(buf, 0, len);
  514. break;
  515. }
  516. try {
  517. Thread.sleep(100);
  518. } catch(InterruptedException e) {
  519. }
  520. }
  521. return c;
  522. }
  523. }