2016年6月29日 星期三

Java SocketServer的運用

最近實作簡單的SocketServer,可以互相多人通訊

先來講講 我實作的 Server Client 概念

我把SocketServer分為四個部分

第一部分initLayout(),我利用swing來繪製程式,主要是宣告一個panel,然後把繪圖元件都丟進去panel裡,再利用fame新增panel,在更新畫面(fame.ravalidate())

第二部分setIPAdrress(),利用InetAddress物件,把自身IP放入在LBIpAds.setText()。

第三部分initRequestListener(),把TFmsg TextField增加傾聽者(KeyListener),傾聽
TFmsgKeyListener物件,裡面主要功能是keyReleased(KeyEvent event),當按下按鈕放開時,會觸發這個功能。

第四部分是serverReceiver(),我宣告兩個變數ServerSocket和ExecutorService,ServerSocket放入自身接收Port,LISTEN_PORT=2525,而ExecutorService 則是接收當有ServerSocket回應(
serverSocket.accept)把 ServerReceiveThread( socket )放入threadExecutor(Thread Pool)


我們來講解一下ServerReceiveThread部分,這是當有Client回應時,Server會專門創立一個Thread給它,一直傾聽有沒有訊息回來。而ServerRequestThread部分,則是Server想要發送訊息,或者是當有Client傳訊息到Serever再轉發給其他Client時,會使用的物件。


再來是SocketClient部分,也分為四個部分
前兩個部分和Server一樣,
第三部分是initSocketClient(String host,int port)利用new Socket( host, port );連線遠端的Server給他一個Thread執行傾聽遠端Server的訊息這部分和Server一樣

而initRequestListener()部分,也是和Server一樣,傾聽鍵盤回應,然後發送給ClientRequestThread,讓他傳送到Server。

以下是程式碼,可以直接執行

2016年6月21日 星期二

字元與字串

講串流之前,先釐清字元與字串

字元
一個英文字母、數字、或其他符號,我們稱為字元,要表示成一個字元時,我們可以用一對單引號

e.gs.,   char a='b'

而java中有一些特殊字元可以使用,通常用反斜線與一個字元作組合,我們稱之為 逸出序列(escape sequence),而反斜線又稱為逸出字元(escape character)

常見的逸出序列有以下:
1.\n   換行符號
2.\t   水平定位鍵
3.\r   歸位字元
4.\\   列印反斜線
5.\"   列印雙引號

而電腦儲存字元的方式是以八位元整數(1 Byte)來儲存而儲存的整數與符號的對應關係我們稱之為ASCII碼(American Standard Code for Information Interchange) 以前常聽到的對應就是'a'=36 'A'=97

字串
字串顧名思義是一段文字,通常使用一對雙引號將一段文字夾起來,而英文字會佔1Byte,中文字佔2Bytes,而我們要判斷一段文字是否有中文則可以使用

String s="您好";
System.out.println((s.getBytes().length==s.length())?"無中文":"有中文");

利用Bytes總數和字串長度做比對。

2016年6月1日 星期三

粒子群演算法運用及Java程式碼


粒子群主要決策利用「自身經驗」與「其他人經驗」進行決策。

粒子每一次自身經驗都有適應值,可以衡量這次經驗的好壞,
並且有記憶性可以紀錄每次經驗的位置與適應值。

PSO流程圖


PSO表達式





Vid(t+1):下一次粒子的速度
Vid(t):這次粒子的速度
Pid(T):粒子所經過最好的位置(每個粒子都有一個最好位置)
Xid(t):粒子這次的位置
Gid(T):粒子群所經過最好的位置(一個粒子群只會有一個最好位置)
C1,C2:控制且避免數值太大
Xid(t+1):粒子下次的位置


演算法練習:

1.主要是初始化一開始粒子群Initialization,然後依據繁延代數,進行移動ParticleMove,在這個方法裡我有利用varyVector1、varyVector2來控制,避免數值太大,最後如果數值出過-4~4間,強迫介於在這,不然變化量太大造成位置移動有問題。

2.Parameter沒有使用到封裝,如果需要再自行更改程式碼。

3.利用JFreeChart free lib來畫出JFreeLineChart迭代圖