隨筆-88  評(píng)論-77  文章-48  trackbacks-0

          ??? /**
          ???? * 方法名稱:runServer<p>
          ???? * 方法功能:運(yùn)行代理服務(wù)器<p>
          ???? * 參數(shù)說(shuō)明: <p>
          ???? * 返回:void <p>
          ???? * 作者:李明
          ???? * 日期:2006年3月9日
          ???? * @throws IOException
          ???? */
          ??? public void runServer() throws IOException
          ??? {
          ??????? // 創(chuàng)建代理服務(wù)器監(jiān)聽(tīng),端口默認(rèn)為9999(可以通過(guò)屬性文檔修改其他端口)
          ??????? ServerSocket ss = new ServerSocket(localport);
          ??????? final com.zte.ums.zxnm01.cpe.common.http.ProxyUtil proxyUtil = new com.zte.ums.zxnm01.cpe.common.http.ProxyUtil();
          ??????? final byte[] request = new byte[1024];
          ??????? byte[] reply = new byte[4096];

          ??????? while(true)
          ??????? {
          ??????????? Socket client = null, server = null;
          ??????????? try
          ??????????? {
          ??????????????? // 等待客戶連接
          ??????????????? client = ss.accept();
          ??????????????? log.info("*******Client logon*******");
          ??????????????? log.info(client);
          ??????????????? final InputStream streamFromClient = client.getInputStream();
          ??????????????? final OutputStream streamToClient = client.getOutputStream();

          ??????????????? // 連接真實(shí)的服務(wù)器,如果不能連接成功,將向客戶發(fā)送錯(cuò)誤信息,斷開(kāi)本次連接
          ??????????????? // 并且繼續(xù)等待連接.
          ??????????????? try
          ??????????????? {
          ??????????????????? server = new Socket(host, remoteport);
          ??????????????? }
          ??????????????? catch(IOException e)
          ??????????????? {
          ??????????????????? PrintWriter out = new PrintWriter(streamToClient);
          ??????????????????? out.print("Proxy server cannot connect to " + host + ":" + remoteport + ":\n" + e + "\n");
          ??????????????????? out.flush();
          ??????????????????? client.close();
          ??????????????????? continue;
          ??????????????? }

          ??????????????? // 得到連接服務(wù)器的輸入輸出流.
          ??????????????? final InputStream streamFromServer = server.getInputStream();
          ??????????????? final OutputStream streamToServer = server.getOutputStream();

          ??????????????? // 構(gòu)建一個(gè)單獨(dú)線程讀客戶請(qǐng)求并傳給服務(wù)器,此線程為異步.
          ??????????????? Thread t = new Thread()
          ??????????????? {
          ??????????????????? public void run()
          ??????????????????? {
          ??????????????????????? int bytesRead;
          ??????????????????????? String context = null;
          ??????????????????????? try
          ??????????????????????? {
          ??????????????????????????? while((bytesRead = streamFromClient.read(request)) != -1)
          ??????????????????????????? {
          ??????????????????????????????? streamToServer.write(request, 0, bytesRead);
          ??????????????????????????????? context = new String(request).trim();
          ??????????????????????????????? streamToServer.flush();
          ??????????????????????????? }
          ??????????????????????????? // 打印客戶瀏覽器發(fā)來(lái)的信息
          ??????????????????????????? log.info("#################S##############");
          ??????????????????????????? log.info(context);
          ??????????????????????????? log.info("#################E##############");
          ??????????????????????????? // 解析發(fā)來(lái)的信息,獲取請(qǐng)求的主機(jī)地址和端口.
          ??????????????????????????? proxyUtil.setUrl(context);
          ??????????????????????????? host = proxyUtil.getHost();
          ??????????????????????????? remoteport = proxyUtil.getPort();
          ??????????????????????????? log.info("host : '" + host + "'" + " port : '" + remoteport + "'");

          ??????????????????????? }
          ??????????????????????? catch(IOException e)
          ??????????????????????? {
          ??????????????????????????? // e.printStackTrace();
          ??????????????????????? }

          ??????????????????????? // 關(guān)閉請(qǐng)求服務(wù)器連接,屏蔽無(wú)意義的異常,減少代理服務(wù)器負(fù)擔(dān).
          ??????????????????????? try
          ??????????????????????? {
          ??????????????????????????? streamToServer.close();
          ??????????????????????? }
          ??????????????????????? catch(IOException e)
          ??????????????????????? {
          ??????????????????????????? // e.printStackTrace();
          ??????????????????????? }
          ??????????????????? }
          ??????????????? };

          ??????????????? // 開(kāi)啟客戶端到服務(wù)器請(qǐng)求線程
          ??????????????? t.start();

          ??????????????? // 讀服務(wù)器的請(qǐng)求,成功后返回信息給客戶端.
          ??????????????? int bytesRead;
          ??????????????? try
          ??????????????? {
          ??????????????????? while((bytesRead = streamFromServer.read(reply)) != -1)
          ??????????????????? {
          ??????????????????????? streamToClient.write(reply, 0, bytesRead);
          ??????????????????????? streamToClient.flush();
          ??????????????????? }
          ??????????????? }
          ??????????????? catch(IOException e)
          ??????????????? {
          ??????????????????? // e.printStackTrace();
          ??????????????? }

          ??????????????? // 關(guān)閉客戶連接.
          ??????????????? streamToClient.close();
          ??????????? }
          ??????????? catch(IOException e)
          ??????????? {
          ??????????????? System.err.println(e);
          ??????????? }
          ??????????? finally
          ??????????? {
          ??????????????? try
          ??????????????? {
          ??????????????????? if(server != null)
          ??????????????????? {
          ??????????????????????? server.close();
          ??????????????????? }
          ??????????????????? if(client != null)
          ??????????????????? {
          ??????????????????????? client.close();
          ??????????????????? }
          ??????????????? }
          ??????????????? catch(IOException e)
          ??????????????? {
          ??????????????????? e.printStackTrace();
          ??????????????? }
          ??????????? }
          ??????? }
          ??? }

          posted on 2006-04-28 11:24 崛起的程序員 閱讀(258) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 雷山县| 普兰县| 中阳县| 长乐市| 乌兰县| 沧州市| 宝丰县| 镇江市| 平陆县| 三原县| 瓮安县| 习水县| 通海县| 饶平县| 丹东市| 新源县| 桃园市| 黄平县| 诸暨市| 武清区| 岑巩县| 黄山市| 吴堡县| 莱州市| 玛纳斯县| 定日县| 阜南县| 班戈县| 乐陵市| 定州市| 汉寿县| 台湾省| 五家渠市| 郁南县| 比如县| 香格里拉县| 金溪县| 甘肃省| 和政县| 哈巴河县| 志丹县|