<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-20  評(píng)論-2  文章-0  trackbacks-0
      2009年7月16日
    **
     * <pre>
     * Title:         HttpRequestProxy.java
     * Project:     HP-Common
     * Type:        com.hengpeng.common.web.HttpRequestProxy
     * Author:        benl
     * Create:         2007-7-3 上午03:07:07
     * Copyright:     Copyright (c) 2007
     * Company:
     * <pre>
     */
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;

    import org.apache.log4j.Logger;

    /**
     * <pre>
     * HTTP請(qǐng)求代理類(lèi)
     * </pre>
     *
     * @author benl
     * @version 1.0, 2007-7-3
     */
    public class HttpRequestProxy
    {
        /**
         * 連接超時(shí)
         */
        private static int connectTimeOut = 5000;

        /**
         * 讀取數(shù)據(jù)超時(shí)
         */
        private static int readTimeOut = 10000;

        /**
         * 請(qǐng)求編碼
         */
        private static String requestEncoding = "GBK";

        private static Logger logger = Logger.getLogger(HttpRequestProxy.class);

        /**
         * <pre>
         * 發(fā)送帶參數(shù)的GET的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @param parameters 參數(shù)映射表
         * @return HTTP響應(yīng)的字符串
         */
        public static String doGet(String reqUrl, Map parameters,
                String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                for (Iterator iter = parameters.entrySet().iterator(); iter
                        .hasNext();)
                {
                    Entry element = (Entry) iter.next();
                    params.append(element.getKey().toString());
                    params.append("=");
                    params.append(URLEncoder.encode(element.getValue().toString(),
                            HttpRequestProxy.requestEncoding));
                    params.append("&");
                }

                if (params.length() > 0)
                {
                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(reqUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("GET");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();

                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer temp = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    temp.append(tempLine);
                    temp.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = temp.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }

            return responseContent;
        }

        /**
         * <pre>
         * 發(fā)送不帶參數(shù)的GET的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @return HTTP響應(yīng)的字符串
         */
        public static String doGet(String reqUrl, String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                String queryUrl = reqUrl;
                int paramIndex = reqUrl.indexOf("?");

                if (paramIndex > 0)
                {
                    queryUrl = reqUrl.substring(0, paramIndex);
                    String parameters = reqUrl.substring(paramIndex + 1, reqUrl
                            .length());
                    String[] paramArray = parameters.split("&");
                    for (int i = 0; i < paramArray.length; i++)
                    {
                        String string = paramArray[i];
                        int index = string.indexOf("=");
                        if (index > 0)
                        {
                            String parameter = string.substring(0, index);
                            String value = string.substring(index + 1, string
                                    .length());
                            params.append(parameter);
                            params.append("=");
                            params.append(URLEncoder.encode(value,
                                    HttpRequestProxy.requestEncoding));
                            params.append("&");
                        }
                    }

                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(queryUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("GET");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();
                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer temp = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    temp.append(tempLine);
                    temp.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = temp.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }

            return responseContent;
        }

        /**
         * <pre>
         * 發(fā)送帶參數(shù)的POST的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @param parameters 參數(shù)映射表
         * @return HTTP響應(yīng)的字符串
         */
        public static String doPost(String reqUrl, Map parameters,
                String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                for (Iterator iter = parameters.entrySet().iterator(); iter
                        .hasNext();)
                {
                    Entry element = (Entry) iter.next();
                    params.append(element.getKey().toString());
                    params.append("=");
                    params.append(URLEncoder.encode(element.getValue().toString(),
                            HttpRequestProxy.requestEncoding));
                    params.append("&");
                }

                if (params.length() > 0)
                {
                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(reqUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("POST");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();

                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer tempStr = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    tempStr.append(tempLine);
                    tempStr.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = tempStr.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }
            return responseContent;
        }

        /**
         * @return 連接超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
         */
        public static int getConnectTimeOut()
        {
            return HttpRequestProxy.connectTimeOut;
        }

        /**
         * @return 讀取數(shù)據(jù)超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
         */
        public static int getReadTimeOut()
        {
            return HttpRequestProxy.readTimeOut;
        }

        /**
         * @return 請(qǐng)求編碼
         * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
         */
        public static String getRequestEncoding()
        {
            return requestEncoding;
        }

        /**
         * @param connectTimeOut 連接超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
         */
        public static void setConnectTimeOut(int connectTimeOut)
        {
            HttpRequestProxy.connectTimeOut = connectTimeOut;
        }

        /**
         * @param readTimeOut 讀取數(shù)據(jù)超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
         */
        public static void setReadTimeOut(int readTimeOut)
        {
            HttpRequestProxy.readTimeOut = readTimeOut;
        }

        /**
         * @param requestEncoding 請(qǐng)求編碼
         * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
         */
        public static void setRequestEncoding(String requestEncoding)
        {
            HttpRequestProxy.requestEncoding = requestEncoding;
        }
       
        public static void main(String[] args)
        {
            Map map = new HashMap();
            map.put("actionType", "1");
    //        map.put("issueId", "33");
            String temp = HttpRequestProxy.doPost("http://192.168.0.99/AgentPortal/autoHandler", map, "GBK");
            System.out.println("返回的消息是:"+temp);
           
        }
    }

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616102329953
    posted @ 2009-07-16 10:23 C.B.K 閱讀(1810) | 評(píng)論 (1)編輯 收藏

    /*

    下面的程序說(shuō)明了怎樣實(shí)現(xiàn)對(duì)象序列化和反序列化。它由實(shí)例化一個(gè)MyClass類(lèi)的對(duì)象開(kāi)始。該對(duì)象有三個(gè)實(shí)例變量,它們的類(lèi)型分別是String,int和double。這是我們希望存儲(chǔ)和恢復(fù)的信息。

    FileOutputStream被創(chuàng)建,引用了一個(gè)名為“serial”的文件。為該文件流創(chuàng)建一個(gè)ObjectOutputStream。ObjectOutputStream 的writeObject( )方法用來(lái)序列化對(duì)象。對(duì)象的輸出流被刷新和關(guān)閉。
    然后,引用名為“serial”的文件創(chuàng)建一個(gè)FileInputStream類(lèi)并為該文件創(chuàng)建一個(gè)ObjectInputStream類(lèi)。ObjectInputStream 的readObject( )方法用來(lái)反序列化對(duì)象。然后對(duì)象輸入流被關(guān)閉。
    注意MyClass被定義成實(shí)現(xiàn)Serializable接口。如果不這樣做,將會(huì)引發(fā)一個(gè)NotSerializableException異常。試圖做一些把MyClass實(shí)例變量聲明成transient的實(shí)驗(yàn)。那些數(shù)據(jù)在序列化過(guò)程中不被保存

    */

    import java.io.*;
    class MyClass implements Serializable{
     String s;
     int i;
     double d;
     public MyClass (String s,int i,double d){
      this.s = s;
      this.i = i;
      this.d = d;
     }
     public String toString(){
      return "s=" + s + "; i=" + i + "; d=" + d;
     }
    }
    class SerializationDemo{
     public static void main(String[] args){
      //Object serialization.
      try{
       MyClass object1 = new MyClass("Evan",9,9.9e10);
       System.out.println("object1 : " +object1);
       FileOutputStream fos = new FileOutputStream("serial");
       ObjectOutputStream oos = new ObjectOutputStream(fos);
       oos.writeObject(object1);
       oos.flush();
       oos.close();
      }catch(Exception e){
       System.out.println("Exception during serialization :" + e);
       System.exit(0);
      }
      //Object deserialization.
      try{
       MyClass object2 ;
       FileInputStream fis = new FileInputStream("serial");
       ObjectInputStream ois = new ObjectInputStream(fis);
       object2 = (MyClass)ois.readObject();
       ois.close();
       System.out.println("object2 : " +object2);
      }catch(Exception e){
       System.out.println("Exception during serialization :" + e);
       System.exit(0);
      }
     }
    }


    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616101541196
    posted @ 2009-07-16 10:16 C.B.K 閱讀(173) | 評(píng)論 (0)編輯 收藏
    Java的serialization提供了一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)持久化對(duì)象時(shí),可能有一個(gè)特殊的對(duì)象數(shù)據(jù)成員,我們不想
    用serialization機(jī)制來(lái)保存它。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉serialization,可以在這個(gè)域前加上關(guān)鍵字transient。
    transient是Java語(yǔ)言的關(guān)鍵字,用來(lái)表示一個(gè)域不是該對(duì)象串行化的一部分。當(dāng)一個(gè)對(duì)象被串行化的時(shí)候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進(jìn)去的。

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096161094144
    posted @ 2009-07-16 10:09 C.B.K 閱讀(158) | 評(píng)論 (0)編輯 收藏
      2009年7月10日

    匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]
    匹配雙字節(jié)字符(包括漢字在內(nèi)): [^\x00-\xff]

    應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
    String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
    匹配空行的正則表達(dá)式: \n[\s| ]*\r
    匹配HTML標(biāo)記的正則表達(dá)式: /<(.*)>.*<\/>|<(.*) \/>/
    匹配首尾空格的正則表達(dá)式: (^\s*)|(\s*$)

    應(yīng)用:javascript中沒(méi)有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來(lái)實(shí)現(xiàn),如下:
    String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g, "");
    }


    利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:
    下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值的javascript程序:

    function IP2V(ip) {
    re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達(dá)式
    if(re.test(ip)) {
    return RegExp.*Math.pow(255,3))+RegExp.*Math.pow(255,2))+RegExp.*255+RegExp.*1
    }
    else {
    throw new Error("Not a valid IP address!")
    }
    }


    不過(guò)上面的程序如果不用正則表達(dá)式,而直接用split函數(shù)來(lái)分解可能更簡(jiǎn)單,程序如下:

    var ip="10.100.20.168"
    ip=ip.split(".")
    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
    匹配Email地址的正則表達(dá)式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    匹配網(wǎng)址URL的正則表達(dá)式: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?


    利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*/g,"")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2) //結(jié)果為:abcefgi


    用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1

    s="http://www.9499.net/page1.htm"
    s=s.replace(/(.*\/)([^\.]+).*/ig,"")
    alert(s)


    利用正則表達(dá)式限制網(wǎng)頁(yè)表單里的文本框輸入內(nèi)容:

    用正則表達(dá)式限制只能輸入中文:
    onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

    用正則表達(dá)式限制只能輸入全角字符:
    onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字:
    onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字和英文:
    onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961005220547
    posted @ 2009-07-10 12:52 C.B.K 閱讀(214) | 評(píng)論 (0)編輯 收藏
    ant手冊(cè)中的ant配置classpath采用classpath標(biāo)簽,可是我發(fā)現(xiàn)這樣配置總是不好用,還是直接用path可以使用
      設(shè)置classpath的方法有多種
    <path id="project.classpath">
        1<pathelement path="${basedir}/lib/aa.jar"/>
       2<pathelement location="aa.jar"/>與1的區(qū)別在于location可以去當(dāng)前路徑,當(dāng)然可以使用絕對(duì)路徑
        3<filelist id="file" dir="${basedir}/lin">
              <file name="a.jar"/>
              <file name="d:lib/b.jar"/>
         </filelist>
       4<fileset dir="d:/lib">
           <include name="**/*.jar"/>
        </fileset>
       5手冊(cè)上說(shuō)了dirset也好用,但是我測(cè)試了還是不要用的
    </path>   
      下面說(shuō)classpath的使用
       樣例如下
         <javac scdir="./src" destdir="./classes">
               <classpath refid="project.classpath"/> 
       </javac>


    下面是比較四種方式的優(yōu)缺點(diǎn)
       第一種調(diào)用的需要設(shè)置絕對(duì)路徑適合第三方j(luò)ar包
        第二種則適合jar包和build.xml文件在同一目錄下的情況,但是我覺(jué)得兩個(gè)文件放在一起本身就不合理,估計(jì)是用的情況不多。
      前兩個(gè)都是設(shè)置單個(gè)jar包
       第三種是一個(gè)文件集合適合引入不同路徑的jar包,但是需要輸入每個(gè)jar包的名字,比較繁瑣,適合于jar包屬于不同位置,比較分散但是不多的情況
      第四種是一個(gè)文件夾,可以采用匹配模式來(lái)引入,這個(gè)適合在同一個(gè)文件夾下,文件名字比較多的情況下

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961051533899
    posted @ 2009-07-10 05:16 C.B.K 閱讀(1648) | 評(píng)論 (0)編輯 收藏
    ant的構(gòu)建文件中,有很多核心類(lèi)型,這些核心類(lèi)型都是XXXSet的形式,主要有以下幾個(gè):PatternSet、DirSet、FileSet、PropertySet、ZipFileSet等。說(shuō)下前三個(gè)的功能就應(yīng)該可以舉一反三了。
              1.PatternSet  即模式集合。顧名思義,就是定義一個(gè)模式,他可以用來(lái)指定一個(gè)文件集合。常常可以被外部的target引用,復(fù)用性很強(qiáng)。有includes、 includesfile、excludes、excludesfile屬性。每個(gè)屬性里面還可以嵌套name、if、unless等類(lèi)型。
              2.DirSet  即目錄集合。用來(lái)定義目錄的集合。有dir、casesensitive、followsymlinks和PatternSet也有的那4個(gè)屬性。上面說(shuō)過(guò)PatternSet可以很好的復(fù)用。下面就是一個(gè)例子:
    Xml代碼
    1. <dirset dir="${build.dir}">  
    2.                <patternset id="non.test.classes">  
    3.                       <include name="apps/**/classes"/>  
    4.                        <exclude name="apps/**/*Test*"/>  
    5.                 </patternset>  
    6.  </dirset>  
    <dirset dir="${build.dir}">
                   <patternset id="non.test.classes">
                          <include name="apps/**/classes"/>
                           <exclude name="apps/**/*Test*"/>
                    </patternset>
     </dirset>
    
     

            這是用patternset來(lái)定義DirSet的模式,這個(gè)模式還可以在外部引用。如:

    Xml代碼
    1. <dirset dir="{build.dir}">  
    2.                 <patternset refid="non.test.classes"/>  
    3. </dirset>  
      <dirset dir="{build.dir}">
                      <patternset refid="non.test.classes"/>
      </dirset>
     

              上面定義了一個(gè)名為non.test.classes的PatternSet,現(xiàn)在就可以引用他了。refid即reference ID.
              3.FileSet即文件集合,他的內(nèi)部屬性與DirSet幾乎一樣,只是多了一個(gè)file和defaultexcludes。和dirset一樣,經(jīng)常 嵌入patternset來(lái)定義文件集合;但是也有另外一個(gè)很常用的類(lèi)型,叫selector,它并不是一個(gè)真正的類(lèi)型或元素,只是一種、一類(lèi)類(lèi)型的統(tǒng) 稱(chēng)。如contains、date、depend、depth、different、filename、present、containsregexp、 size、type等。


    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096105521217
    posted @ 2009-07-10 05:05 C.B.K 閱讀(429) | 評(píng)論 (0)編輯 收藏
      2009年6月29日
    第一種方法:
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    -> ON <dbname>.*
    -> TO <username>@<host name>
    -> IDENTIFIED BY '<password>';

    where <dbname> is the name of the database you are tyring to connect to, <username> is the username of the user trying to connect to the database, <host name> the name of the host (in your case the XXX host) and <password> the password of the user.
    第二種方法:
    通過(guò)客戶(hù)端軟件設(shè)置用戶(hù)的主機(jī)以及權(quán)限,
    message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952925050579
    posted @ 2009-06-29 14:51 C.B.K 閱讀(1563) | 評(píng)論 (0)編輯 收藏
      2009年6月23日

    一、什么是條件變量

           與互斥鎖不同,條件變量是用來(lái)等待而不是用來(lái)上鎖的。條件變量用來(lái)自動(dòng)阻塞一個(gè)線(xiàn)程,直到某特殊情況發(fā)生為止。通常條件變量和互斥鎖同時(shí)使用。

           條件變量使我們可以睡眠等待某種條件出現(xiàn)。條件變量是利用線(xiàn)程間共享的全局變量進(jìn)行同步的一種機(jī)制,主要包括兩個(gè)動(dòng)作:一個(gè)線(xiàn)程等待"條件變量的條件成立"而掛起;另一個(gè)線(xiàn)程使"條件成立"(給出條件成立信號(hào))。

    條 件的檢測(cè)是在互斥鎖的保護(hù)下進(jìn)行的。如果一個(gè)條件為假,一個(gè)線(xiàn)程自動(dòng)阻塞,并釋放等待狀態(tài)改變的互斥鎖。如果另一個(gè)線(xiàn)程改變了條件,它發(fā)信號(hào)給關(guān)聯(lián)的條件 變量,喚醒一個(gè)或多個(gè)等待它的線(xiàn)程,重新獲得互斥鎖,重新評(píng)價(jià)條件。如果兩進(jìn)程共享可讀寫(xiě)的內(nèi)存,條件變量可以被用來(lái)實(shí)現(xiàn)這兩進(jìn)程間的線(xiàn)程同步。

           使用條件變量之前要先進(jìn)行初始化。可以在單個(gè)語(yǔ)句中生成和初始化一個(gè)條件變量如:

    pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;(用于進(jìn)程間線(xiàn)程的通信)。

    也可以利用函數(shù)pthread_cond_init動(dòng)態(tài)初始化。

     

    二、條件變量函數(shù)

    1

    名稱(chēng):

    pthread_cond_init

    目標(biāo):

    條件變量初始化

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

    參數(shù):

    cptr  條件變量

    attr  條件變量屬性

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

         

     

     

     

     

     

      pthread_cond_init函數(shù)可以用來(lái)初始化一個(gè)條件變量。他使用變量attr所指定的屬性來(lái)初始化一個(gè)條件變量,如果參數(shù)attr為空,那么它將使用缺省的屬性來(lái)設(shè)置所指定的條件變量。

     

    2.

    名稱(chēng):

    pthread_cond_destroy

    目標(biāo):

    條件變量摧毀

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_destroy(pthread_cond_t *cond);

    參數(shù):

    cptr  條件變量

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     pthread_cond_destroy函數(shù)可以用來(lái)摧毀所指定的條件變量,同時(shí)將會(huì)釋放所給它分配的資源。調(diào)用該函數(shù)的進(jìn)程也并不要求等待在參數(shù)所指定的條件變量上。

     

    3.

    名稱(chēng):

    pthread_cond_wait/pthread_cond_timedwait

    目標(biāo):

    條件變量等待

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

    int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);

    參數(shù):

    cond 條件變量

    mutex 互斥鎖

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     

     

     

     

    第一個(gè)參數(shù)*cond是指向一個(gè)條件變量的指針。第二個(gè)參數(shù)*mutex則是對(duì)相關(guān)的互斥鎖的指針。函數(shù)pthread_cond_timedwait函數(shù)類(lèi)型與函數(shù)pthread_cond_wait,區(qū)別在于,如果達(dá)到或是超過(guò)所引用的參數(shù)*abstime,它將結(jié)束并返回錯(cuò)誤ETIME.pthread_cond_timedwait函數(shù)的參數(shù)*abstime指向一個(gè)timespec結(jié)構(gòu)。該結(jié)構(gòu)如下:

    typedef struct timespec{

           time_t tv_sec;

           long tv_nsex;

    }timespec_t;

     

    3.

    名稱(chēng):

    pthread_cond_signal/pthread_cond_broadcast

    目標(biāo):

    條件變量通知

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_signal(pthread_cond_t *cond);

    int pthread_cond_broadcast(pthread_cond_t *cond);

    參數(shù):

    cond 條件變量

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     

     

     參數(shù)*cond是對(duì)類(lèi)型為pthread_cond_t 的一個(gè)條件變量的指針。當(dāng)調(diào)用pthread_cond_signal時(shí)一個(gè)在相同條件變量上阻塞的線(xiàn)程將被解鎖。如果同時(shí)有多個(gè)線(xiàn)程阻塞,則由調(diào)度策略確定接收通知的線(xiàn)程。如果調(diào)用pthread_cond_broadcast,則將通知阻塞在這個(gè)條件變量上的所有線(xiàn)程。一旦被喚醒,線(xiàn)程仍然會(huì)要求互斥鎖。如果當(dāng)前沒(méi)有線(xiàn)程等待通知,則上面兩種調(diào)用實(shí)際上成為一個(gè)空操作。如果參數(shù)*cond指向非法地址,則返回值EINVAL

     

    下面是一個(gè)簡(jiǎn)單的例子,我們可以從程序的運(yùn)行來(lái)了解條件變量的作用。

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*
    初始化互斥鎖*/
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*
    初始化條件變量*/

    void *thread1(void *);
    void *thread2(void *);

    int i=1;
    int main(void)
    {
        pthread_t t_a;
        pthread_t t_b;

        pthread_create(&t_a,NULL,thread2,(void *)NULL);/*
    創(chuàng)建進(jìn)程t_a*/
        pthread_create(&t_b,NULL,thread1,(void *)NULL); /*
    創(chuàng)建進(jìn)程t_b*/
        pthread_join(t_b, NULL);/*
    等待進(jìn)程t_b結(jié)束*/
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
        exit(0);
    }

    void *thread1(void *junk)
    {
        for(i=1;i<=9;i++)
        {
            pthread_mutex_lock(&mutex);/*
    鎖住互斥量*/
            if(i%3==0)
                 pthread_cond_signal(&cond);/*
    條件改變,發(fā)送信號(hào),通知t_b進(jìn)程*/
            else       
                 printf("thead1:%d\n",i);
            pthread_mutex_unlock(&mutex);/*
    解鎖互斥量*/

    sleep(1);
    }

    }

    void *thread2(void *junk)
    {
        while(i<9)
        {
            pthread_mutex_lock(&mutex);

    if(i%3!=0)
                pthread_cond_wait(&cond,&mutex);/*
    等待*/
            printf("thread2:%d\n",i);
            pthread_mutex_unlock(&mutex);

    sleep(1);
    }

    }

    程序創(chuàng)建了2個(gè)新線(xiàn)程使他們同步運(yùn)行,實(shí)現(xiàn)進(jìn)程t_b打印20以?xún)?nèi)3的倍數(shù),t_a打印其他的數(shù),程序開(kāi)始線(xiàn)程t_b不滿(mǎn)足條件等待,線(xiàn)程t_a運(yùn)行使a循環(huán)加1并打印。直到i3的倍數(shù)時(shí),線(xiàn)程t_a發(fā)送信號(hào)通知進(jìn)程t_b,這時(shí)t_b滿(mǎn)足條件,打印i值。

    下面是運(yùn)行結(jié)果:

    #cc –lpthread –o cond cond.c

    #./cond

    thread1:1

    thread1:2

    thread2:3

    thread1:4

    thread1:5

    thread2:6

    thread1:7

    thread1:8

    thread2:9


    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095235658763
    posted @ 2009-06-23 17:07 C.B.K 閱讀(292) | 評(píng)論 (0)編輯 收藏
    工具:grub4dos0.4.2(想要的給我發(fā)信,我發(fā)給你,loveitdoit@163.com)

    文件:fedora7.0映像文件,可在網(wǎng)上下載。

    過(guò)程:

    1.解壓縮grub4dos0.4.2,把里面的 grldr和menu.lst,文件復(fù)制到c盤(pán)根目錄下。

    2.fedora7.0映像文件不必解壓,必須放在fat32的分區(qū)里。把里面的isolinux目錄下

    的VMLINUZ、INITRD.IMG解壓到c盤(pán)根目錄下。

    3.在c:\下找到menu.lst,用記事本打開(kāi)并修改,刪除其他命令,添加以下命令!


    title Linux System Install

    kernel (hd0,0)/vmlinuz

    initrd (hd0,0)/initrd.img


    4.修改c:\boot.ini文件,在最后面添加c:\grldr="Start GRUB"并保存即可。

    5.重起系統(tǒng),選擇Start GRUB,開(kāi)始安裝。

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095234437396
    posted @ 2009-06-23 16:05 C.B.K 閱讀(141) | 評(píng)論 (0)編輯 收藏
    花了半天時(shí)間研究了下下MYSQL的備份實(shí)現(xiàn),發(fā)現(xiàn)其是在MY.CNF(MY.INI)配置文件中作的設(shè)置,直接設(shè)置服務(wù)器唯一性ID號(hào)加上其它的附加設(shè) 置,則可作為一臺(tái)MASTER,而在 SLAVE機(jī)上,也只需要在配置文件中設(shè)置一下連接MASTER所需的參數(shù)即可,如果在MASTER里也加上連到SLAVE機(jī)的參數(shù),則就是雙向備份 了~~不過(guò),這些連接參數(shù)中用到的賬號(hào)需要注意權(quán)限的設(shè)置,否則會(huì)搞半天沒(méi)反就急死你迪。。。
    我在WIN上和LINUX上各裝了MYSQL5,下面是它們的配置:
    WIN(172.22.33.33)下的MASTER(由于我改了端口3327所以下面多加了個(gè)端口方面的特殊處理了)的配置(my.ini):(**一定要在mysqld配置段中配置,不象PHP,APACHE可以隨便找個(gè)方便的地方配的,注意哈!!)

    [mysqld]
    #master 設(shè)置
    server-id=1
    log-bin=c:/masterlog
    binlog-do-db=db5

    #實(shí)現(xiàn)雙機(jī)備份段,給MASTER同時(shí)加上SLAVE段,可選哈,如果不選,那就是WIN到LIN的主從備份

    master-host=172.22.1.37
    master-user=backup2
    master-password=backup2
    master-port=3306
    master-connect-retry=60
    replicate-do-db=db5

    數(shù)據(jù)庫(kù)中加一個(gè)賬號(hào):

    GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
    TO [email=backup@]backup@'172.22.1.37'[/email] IDENTIFIED by 'backup';
    這個(gè)權(quán)限表示,這個(gè)backup賬號(hào)只能由從備份機(jī)172.22.1.37訪問(wèn)只能用來(lái)進(jìn)行備份操作
    LINUX(172.22.1.37)下的SLAVE機(jī)的配置(把安裝目錄里找到的任意一個(gè)*.cnf拷到/etc/my.cnf下進(jìn)行修改):

    server-id=2
    #如果不需要雙向備份下面兩行可以不要
    #否則還要加一個(gè)數(shù)據(jù)庫(kù)用戶(hù)賬號(hào)
    /*
    GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
    TO [email=backup2@]backup2@'172.22.33.33'[/email] IDENTIFIED by 'backup2';
    */
    log-bin=./masterlog
    binlog-do-db=db5
    #---------------------------------------
    master-host=172.22.33.33
    master-user=backup
    master-password=backup
    master-port=3327
    master-connect-retry=60
    replicate-do-db=db5
    由于只是大概的弄了一下,特別是在數(shù)據(jù)庫(kù)用戶(hù)方面沒(méi)有作仔細(xì)試驗(yàn):),可能會(huì)有所不太準(zhǔn)確的地方,還有就是,上面測(cè)試用到的數(shù)據(jù)庫(kù)一定要是已經(jīng)建立好并且 結(jié)構(gòu)相同的,兩臺(tái)機(jī)子都重啟后會(huì)進(jìn)行檢查,如果出現(xiàn)找不到或者檢查到結(jié)構(gòu)不同,會(huì)報(bào)錯(cuò),最好就是在創(chuàng)建空數(shù)據(jù)庫(kù)時(shí)或初始時(shí)安裝兩個(gè)一樣的數(shù)據(jù)庫(kù)后就建立好 關(guān)系,對(duì)于不同版本的MYSQL,官方說(shuō)明也可以同步,但想一想,把MYSQL5 的數(shù)據(jù)備份到4中去丟失5的特性也沒(méi)什么意義吧。。

    文章來(lái)源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952335921779
    posted @ 2009-06-23 15:59 C.B.K 閱讀(219) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題  下一頁(yè)
    主站蜘蛛池模板: 又大又硬又爽免费视频| 亚洲日本va中文字幕久久| 久久中文字幕免费视频| 亚洲JLZZJLZZ少妇| 亚洲女人初试黑人巨高清| 国产成人A人亚洲精品无码| 俄罗斯极品美女毛片免费播放| 一本岛高清v不卡免费一三区| 日韩免费在线视频| 在线观看人成视频免费无遮挡| 免费看一级毛片在线观看精品视频| 456亚洲人成在线播放网站| 久久久久亚洲AV无码网站| 亚洲熟妇无码乱子AV电影| 亚洲国产精品狼友中文久久久| 免费高清资源黄网站在线观看| av免费不卡国产观看| 91热久久免费精品99| 久久国产免费一区| 中文字幕乱码一区二区免费| g0g0人体全免费高清大胆视频| 特黄aa级毛片免费视频播放| 亚洲国产精品99久久久久久| 亚洲欧洲国产精品久久| 亚洲精品国产情侣av在线| 亚洲视频一区调教| 亚洲三级电影网址| 亚洲天天在线日亚洲洲精| 午夜影视日本亚洲欧洲精品一区| 亚洲av无码一区二区三区不卡| 亚洲高清专区日韩精品| 亚洲国产三级在线观看| 久久亚洲国产精品五月天| 亚洲AV中文无码字幕色三| 亚洲国产精品自在线一区二区| 久久亚洲精品无码aⅴ大香 | 美女视频免费看一区二区| 在线播放亚洲精品| 免费毛片毛片网址| 99在线免费观看| 亚洲精品在线免费观看|