黑馬程式設計師 Socket網路程式設計 聊天室

2021-06-15 05:20:05 字數 3506 閱讀 8093

------- 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,必須建立連線,效率...