Pages

2011年5月11日 星期三

[Java] 聊天程式撰寫需用到的觀念

最近正在用Java撰寫一個可聊天傳檔的程式,撰寫過程記錄以下筆記:

1.  Character類別的isISOControl( )函式,用途是判斷字元是否是ISO Control Character,這個函式參數只有一個,就是一個字元。丟一個字元給此函式,如果字元是ISO Control Character,就回傳true。Control Character是不能顯示的,所以在撰寫聊天程式時,需要注意字元傳遞不能傳遞到控制字元。
2.   使用StringTokenizer,注意一種用法:
假設要設計一種下命令的格式: [command] [命令參數]
則這樣Token的切法必須要以 " \t” (空白或\t)為delimiter切出[command],再用nextToken(“\n")先將delimiter強制改為"\n”,然後把[command]後面的東西全部抓下來。StringTokenizer簡單用法:
    StringTokenizer stn = new StringTokenizer(s, “ \t”);
    if(stn.countToken() >=1) cmd = stn.nextToken();
    argument = stn.nextToken(“\n”);
3.   String類別中,trim的用法:
      s.trim()    // s是一個字串,trim()把s頭尾的空白全部砍掉。
4.   SeverSocket的使用方法:
      Socket其實是一種表格。程式的通訊資料要記錄在此表格內才可以通訊。封包的傳遞過程,需要以Socket表格作為依據來通訊。連線時,兩端連線的電腦可被視為socket。
      ServerSocket類別可以建立一個Sever端的Socket給Server端使用,其中我先研究了ServerSocket的幾個函式:
      (i) accept() :這個函式可以傾聽一個連線要求。舉例如下:
               //現在是站在server這一邊的觀點來看。
               //宣告一個Socket,叫做clientSkt。
              Socket clientSkt;
              // …
              ServerSocket serverSkt;
              //….
              clientSkt = serverSkt.accept();
              //如此遠方有一個人連進我這裡的server,就accept住,
              //然後丟給clientSkt來處理。可是可能有很多人連進來,
              //所以要替每個連線新增一個Thread。
5.   synchronized lock:
      這部份似乎是設計遠端連線程式時的一個困難部分。在不同的Thread運行時可能會要access同樣的資料,這些資料稱為critical sections。因此將critical section用synchronized鎖住,是java撰寫多執行緒程式常用到的方法。
      synchronized又分為兩種,第一種是synchronized method:
      synchronized void UncleFunc( )
      {
          //…
      }
      一個Thread開始執行某個被synchronized住的方法時,要注意一件事:這個Thread目前是在鎖定特定的物件,不是鎖定特定的類別。其他的物件並沒有被這個Thread鎖定。而且鎖定的東西只限於這個UncleFunc(),其他沒有被synchronized的方法就沒有被Thread鎖定。要等Thread執行完UncleFunc( )的內容後,別的Thread才可以使用這個UncleFunc()。
      第二種synchronized稱為synchronized block:
      synchronized(uncleObject)
      {
           //content…
      }
      這種用法,要注意:如果被synchronized的物件是同一個物件,則如此可以保證block內的程式被同一個Thread執行。如果被synchronized的物件是同一類別的不同物件,則block內的程式有可能會同時被多個Thread執行。
      對於synchronized我目前比較少研究,之後會再特別研究Thread執行時synchronized的運用時機。
6.   String類別的substring( )用法:
      可以只放一個參數:"IamUncle”.substring(3)回傳的是"Uncle",3是index,index為3的那個字也會回傳。
       如果丟兩個參數:"IamUncle".substring(3,7)回傳是"Uncl",從index為3開始到index為6的位置全部回傳,注意index為7的字元不會回傳。
7.   Socket類別的getInetAddress()回傳是遠端機器的IP,而這個回傳的IP是InetAddress類別。而InetAddress類別有一個getHostAddress()方法,可以將InetAddress類別所代表的IP轉為String類別。所以可以用下列方法得到IP字串:
      String ipAdd = mySocket.getInetAddress().getHostAddress();
8.   建立起一個Socket之後,這個Socket會有其InputStream和OutputStream,其中InputStream可以包成BufferedReader有助於用readLine()來讀取一整行,OutputStream可以包成PrintWriter有助於直接用print()跟println()等函式。           

沒有留言:

張貼留言