2015年9月12日 星期六

C# Socket 傳送訊息、指令、檔案筆記

目標


設計兩支程式,一支安裝在我想「觀看」的電腦,一支放在我的電腦。

在對方電腦開機後可以隨時看到對方的畫面

可以複製對方電腦的檔案

對方電腦執行特定程式時可以通知我

這支程式叫做 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 連線後,兩邊都可以透過這條線傳送資料的。

Socket 本身並沒有所謂的斷線,儘管某一邊已經關閉 Socket,還是可以從另一邊 Send。要檢查這條線有沒有斷掉,估計需要透過不斷的詢問對方來得知,Socket 本身的 Connected 屬性不知道有啥用。

原本想說所有傳送的資料都用設計為一個指令,用 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 陣列包裝起來,嗯!

沒有留言:

張貼留言