目標
設計兩支程式,一支安裝在我想「觀看」的電腦,一支放在我的電腦。
在對方電腦開機後可以隨時看到對方的畫面
可以複製對方電腦的檔案
對方電腦執行特定程式時可以通知我
這支程式叫做 FiveGhost
Before 2015/9/12
Server 端的 Socket 需要 Listen 才可讓 Client 開始連線。
Server 端的 Socket 在 Accept 後會拿到一個專門處理該 Client 的新 Socket,該開一個新的 Thread 來處理他才能繼續 Accept 其他的 Client。
2015/9/12
網路傳輸這東西是非同步的,一次的 Receive 可能不會收到完整的資料,因此需要透過結尾符號來判斷,並加上 Timeout 機制來斷定對方是否還有在傳資料。
在 Server 與 Client 建立 Socket 連線後,兩邊都可以透過這條線傳送資料的。
原本想說所有傳送的資料都用設計為一個指令,用 Class 包裝為物件再以序列化傳送,後來想想不太行,假設今天已經把程式植入對方電腦,過了一陣子程式有更新,可能稍微修改了 Class,監控端的電腦使用新的版本,但沒空將新版的程式去重新植入對方電腦,可能會導致反序列化錯誤。
2015/9/14
平常只要一個 Class 裡面東西太多,就會想辦法封裝,讓一個 Class 保持清爽。今天在看別人的範例時發現一個問題,把一些簡單的 API 封裝會讓看 Code 的人看得有點痛苦,不易快速讀懂 Code。日後在撰寫範例時需考慮到這點。
2015/10/2
大致上完成了,傳送畫面、檔案都 OK。
寫到向 server 要求檔案這部分,檔案傳回來後希望彈出 dialog 詢問要存在哪兒,在這裡遇到非 UI 執行緒的問題,這沒什麼以前常寫,C# 就是用個 Invoke 呼叫 delegate,但遇到一個小問題,我要委派的 function 要帶參數(檔案),我馬上想到以前寫另開 thread 執行帶參數的方法,開一個 class 把要用的東西先塞進去,再委派物件裡邊不用餐數的 function 執行就好了,確實這樣寫沒問題,但又想到,現在 C# 都有可以帶參數的 ThreadStart 了,這個 Invoke 應該也有辦法帶參數才是,果然 Invoke 有另一個 overload,第一個參數是 delegate,第二個參數是要傳過去 function 的參數,用 object 陣列包裝起來,嗯!