------- windows phone 7手機開發、.net培訓、期待與您交流! -------
一、 網路中程序之間如何通訊?
首先解決的問題是:如何唯一標識乙個程序,否則通訊無從談起。在本地,可以用程序的pid來唯一標識乙個程序,而在網路中則行不通。tcp/ip協議族已解決了這個問題:網路層的「ip位址」可以唯一標識網路中的主機,而傳輸層的「協議+埠」可以唯一標識主機中的應用程式(程序)。這樣利用三元組(ip位址,協議,埠)就可以標識網路中的程序了,網路中的程序標識就可以利用這個標識與其他程序進行互動。
二、 什麼是socket
用於描述ip位址和埠,是乙個通訊鏈的控制代碼。通過socket可以接收和傳送網路上的資料。
三、 socket一般應用模式(服務端和客戶端)
1、 服務端的socket(至少需要兩個)
(1) 乙個負責接收客戶端連線請求(但不負責通訊);
(2) 每成功接收到乙個客戶端的連線便在服務端產生乙個對應的socket。
2、 客戶端的socket
(1) 必須指定要連線的服務端ip和埠;
(2) 通過建立乙個socket物件來初始化乙個到服務端的tcp連線。
四、 socket的通訊過程
1、 服務端
a) 申請乙個socket
b) 繫結到ip位址和埠
c) 開啟監聽
d) 等待客戶端的連線請求。
2、 客戶端
a) 申請乙個socket
b) 向伺服器發起連線(指明ip位址和埠號)。
五、 面向連線的套接字呼叫時序
六、 例項:聊天程式
功能:服務端和客戶端互相收發訊息,服務端可以接受多個客戶端的連線請求,並與之通訊。
1、服務端程式:
using system;
using system.collections.generic;
using system.text;
using system.windows.forms;
//引入命名空間
using system.net; //ipaddress、ipendpoint類
using system.net.sockets;
using system.threading;
namespace server_end
//在文字框顯示資訊
void showmsg(string msg)
//負責監聽的socket
socket sockwatch = null;
//key:遠端主機的ip、埠,value:負責和該主機通訊的服務端socket
dictionarydict = new dictionary();
//開啟監聽服務
private void btnstartservice_click(object sender, eventargs e)
/// /// 監聽連線請求
///
void watchaccp()
}/// /// 接收訊息
///
void recmsg(object obj)
:", sockcon.remoteendpoint.tostring(), strrecmsg));}}
//傳送訊息
private void btnsend_click(object sender, eventargs e)}}
}
服務端**分析:
a) socket.accept()成員方法,會阻斷當前執行緒,所以需要建立乙個新執行緒執行該操作。
b) 每當有乙個客戶端連線伺服器時,就建立乙個socket負責和客戶端通訊。這裡用dictionary泛型,儲存兩者的對應關係。服務端向客戶端發訊息時,從dictionary字典中取出與客戶端對應的服務端socket,然後用該socket傳送訊息;
c) receive方法會阻斷當前執行緒,因此服務端在監聽到客戶端的連線請求後,就建立乙個新執行緒來執行新連線的通訊,接收客戶端的訊息;
d) checkforillegalcrossthreadcalls=false:關閉跨執行緒訪問控制項的檢查,這裡threadwath執行緒訪問了ui執行緒建立的textbox控制項txtrecmsg,預設是不允許的,所以這裡設定該屬性為false,就可以跨執行緒訪問了。
2、 客戶端**
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.net;
using system.net.sockets;
using system.threading;
namespace client_end
//在文字框顯示資訊
void showmsg(string msg)
socket sockclient = null;
private void btnconnect_click(object sender, eventargs e)
private void btnsend_click(object sender, eventargs e)}}
客戶端**分析:
a) 首先申請乙個socket,指定服務端的ip和埠,請求連線(connect);
b) 客戶端需要不斷的接收服務端的訊息,所以建立乙個後台執行緒,不斷的迴圈接收(receive)訊息,如果收到訊息,顯示出來;
c) 如果伺服器關閉了連線,客戶端報socketexception異常。捕獲該異常,提示「伺服器已斷開連線」,然後不再繼續接收服務端的訊息。
六、 例項:異常處理
server和client建立連線後,先關閉client視窗,伺服器**報異常:
「未處理:socketexception 遠端主機強迫關閉了乙個現有的連線。」
解決辦法:try-catch捕獲socketexception,然後關閉當前服務端socket,並中斷接收客戶端訊息。
服務端接收訊息的部分**如下:
void recmsg(object obj)
catch (socketexception e)}}
-------
windows phone 7手機開發、
.net培訓、期待與您交流! -------
黑馬程式設計師 網路程式設計
asp.net android ios開發 net培訓 期待與您交流!1.套接字 socket 用於描述 ip位址和埠,是乙個通訊鏈的控制代碼 就是兩個程式通訊用的 類似於 2.有兩種型別 流式socket 是一種面向連線的 socket 針對於面向連線的 tcp服務應用,安全,但效率低 資料報式 ...
黑馬程式設計師 網路程式設計
asp.net android ios開發 net培訓 期待與您交流!1 網路程式設計 1 網路程式設計 通過程式語言實現計算機鍵的資料通訊。2 網路程式設計的三要素 a ip位址。網路中每一台計算機的唯一標識。b 埠 用於標識程序的邏輯位址 c 協議 定義通訊規則 舉例 我要和小青說話。a 找到小...
黑馬程式設計師 網路程式設計
asp.net unity開發 net培訓 期待與您交流!網路傳輸過程 1,找到對方ip 2,資料傳送到指定埠 每個應用程式對應乙個埠 3,定義通訊規則,即協議 tcp ip tcp 1,面向連線,形成傳輸資料的通道 像打 2,連線中進行大量資料量傳輸 3,可靠協議,三次握手,4,必須建立連線,效率...