第十章 Socket網(wǎng)絡(luò)編程_第1頁(yè)
第十章 Socket網(wǎng)絡(luò)編程_第2頁(yè)
第十章 Socket網(wǎng)絡(luò)編程_第3頁(yè)
第十章 Socket網(wǎng)絡(luò)編程_第4頁(yè)
第十章 Socket網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 2 10.1 Socket網(wǎng)絡(luò)編程基礎(chǔ)網(wǎng)絡(luò)編程基礎(chǔ) Windows中的很多東西都是從Unix領(lǐng)域借鑒過(guò)來(lái)的, Socket也是一樣。在Unix中,socket代表了一種文件描述符 (在Unix中一切都是以文件為單位),而這里這個(gè)描述符則是 用于描述網(wǎng)絡(luò)訪問(wèn)的。 就是程序員可以通過(guò)socket來(lái)發(fā)送和接收網(wǎng)絡(luò)上的數(shù)據(jù)。 有了它,你就不用直接去操作網(wǎng)卡了,而是通過(guò)這個(gè)接口,這 樣就省了很多復(fù)雜的操作。 在C#中,MS為我們提供了 System.Net.Sockets 命名空間, 里面包含了Socket類。 3 要想訪問(wèn)網(wǎng)絡(luò),必須具有下面的基本條件: 要確定本機(jī)的IP和端口,socket只有與某

2、一IP和端口綁定,才 能發(fā)揮強(qiáng)大的威力。 a. 定義網(wǎng)絡(luò)協(xié)議。最常見(jiàn)的兩種協(xié)議:TCP 使用指定的地址族、套接字類型和協(xié)議初始化 Socket 類的新實(shí)例。 public Socket ( AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType ) 8 Socket對(duì)象的常用屬性 Connect 格式:public bool Connected 說(shuō)明:獲取Socket的連接狀態(tài),若網(wǎng)絡(luò)連接已成功創(chuàng)建則返回True,否則返 回False LocalEndPoint 格式:public EndPoi

3、nt 說(shuō)明:獲取代表本地端計(jì)算機(jī)的EndPoint對(duì)象,包含IP地址和端口號(hào)等信息。 ProtocolType 格式:public int 說(shuō)明:獲取該Socked對(duì)象所使用的通信協(xié)議的種類。 Handle 格式:public intPtr 說(shuō)明:獲取該Socket對(duì)象在操作系統(tǒng)中的句柄。 9 服務(wù)器端要進(jìn)行偵聽操作服務(wù)器端要進(jìn)行偵聽操作(Listen),必須將本機(jī)的,必須將本機(jī)的IP和端口號(hào)與和端口號(hào)與 一個(gè)一個(gè)Socket進(jìn)行綁定。進(jìn)行綁定。 Socket.Bind(EndPoint localEP); EndPoint類的說(shuō)明 功能:用來(lái)設(shè)置IP地址和端口號(hào) 構(gòu)造函數(shù): IPEndPoi

4、nt ipep=new IPEndPoint(IPAddress.Any,9050); 屬性: Const int MaxPort;端口號(hào)最大值 Const int MinPort;端口號(hào)最小值 IPAddress Address;獲取或設(shè)置IP地址 Int port;獲取或設(shè)置端口號(hào) 10 偵聽(Listen) Socket對(duì)象在綁定完后,應(yīng)該在該接口上偵聽客 戶端的連接請(qǐng)求。 Public void Listen(int backlog) Backlog指明用戶端Socket連接等候隊(duì)列的大小。 11 接收連接請(qǐng)求(Accept) 當(dāng)Socket偵聽到有用戶端Socket的連接請(qǐng) 求時(shí),會(huì)

5、先產(chǎn)生相對(duì)應(yīng)于用戶端的Socket 對(duì)象,并將這些對(duì)象置于等待連接隊(duì)列中, 然后我們必須調(diào)用Accept方法以完成連接。 Public Socket Accept(); 該方法返回一個(gè)Socket對(duì)象,對(duì)應(yīng)連接隊(duì) 列中第一個(gè)申請(qǐng)連接的客戶端Socket,之 后程序就可以利用該對(duì)象與客戶端通信。 12 接收數(shù)據(jù)(Receive) 利用產(chǎn)生的客戶端Socket的Receive()方法接收數(shù)據(jù) public int Receive ( byte buffer ) buffer-Byte 類型的數(shù)組,它是存儲(chǔ)接收到的數(shù)據(jù)的位置。 返回值:返回值:接收到的字節(jié)數(shù)。 用下面的方法實(shí)現(xiàn)字節(jié)數(shù)組到字符串的轉(zhuǎn)變

6、 stringdata = Encoding.ASCII.GetString(data, startIndex, count); 13 發(fā)送數(shù)據(jù)(Send) 利用接收方Socket的Send()方法發(fā)送數(shù)據(jù) public int Send ( byte buffer ) buffer-Byte 類型的數(shù)組,它是存儲(chǔ)發(fā)送數(shù)據(jù)的位置。 返回值:返回值:實(shí)際送出的字節(jié)數(shù)。 用下面的方法實(shí)現(xiàn)字符串到字節(jié)數(shù)組的轉(zhuǎn)變,并發(fā)送數(shù)據(jù) newclient.Send(Encoding.ASCII.GetBytes(input); 14 與遠(yuǎn)程服務(wù)器建立鏈接 首先使用IPEndPoint類創(chuàng)建一個(gè)包含遠(yuǎn)程主機(jī)IP地

7、址和端口 號(hào)的對(duì)象,然后再創(chuàng)建一個(gè)Socket對(duì)象,調(diào)用該對(duì)象的 Connect()方法就可以建立與遠(yuǎn)程服務(wù)器的連接 Public void Connect(EndPoint remoteEP) 例如: Socket newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);/服務(wù)器的IP和端口 newclient.Connect(ie); 15 套接字關(guān)

8、閉 Shutdown()方法關(guān)閉Socket對(duì)象的發(fā)送和 接收功能。 Close()方法,關(guān)閉套接字 一般先調(diào)用Shutdown(),再調(diào)用Close() 16 Shutdown() Public void Shutdown(SocketShutdown how) How的取值 值 值 說(shuō)明說(shuō)明 Send禁用此 Socket 上的發(fā)送。 Receive 禁用此 Socket 上的接收。 Both 同時(shí)禁用此 Socket 上的發(fā)送和接收。 17 static void Main(string args) int recv;/用于表示客戶端發(fā)送的信息長(zhǎng)度 byte data=new byte10

9、24;/用于緩存客戶端所發(fā)送的信息,通過(guò)socket傳遞的信息 必須為字節(jié)數(shù)組 本機(jī)預(yù)使用的IP和端 口 Socket newsock= Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); newsock.(ipep);/綁定 newsock(10);/監(jiān)聽 Console.WriteLine(waiting for a client); Socket client=newsock.();/當(dāng)有可用的客戶端連接嘗試時(shí)執(zhí)行,并返回一個(gè) 新的socket,用于與客戶端之間的通信 IPEndPoint clie

10、ntip=(IPEndPoint)client.RemoteEndPoint; Console.WriteLine(connect with client:+clientip.Address+ at port:+clientip.Port); string welcome=welcome here!; data=Encoding.ASCII.GetBytes(welcome); 例:例:examplesocketTCPServer 服務(wù)器端服務(wù)器端 18 client.(data,data.Length,SocketFlags.None);/發(fā)送信息 while(true) /用死循環(huán)來(lái)不斷的

11、從客戶端獲取信息 data=new byte1024; recv=client.(data); Console.WriteLine(recv=+recv); if (recv=0)/當(dāng)信息長(zhǎng)度為0,說(shuō)明客戶端連接斷開 break; Console.WriteLine(Encoding.ASCII.GetString(data,0,recv); client.(data,recv,SocketFlags.None); Console.WriteLine(Disconnected from+clientip.Address); client.(); newsock.(); 19 例:例:examp

12、lesocketTCPClient 客戶端客戶端 static void Main(string args) byte data = new byte1024; Socket newclient = (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.Write(please input the server ip:); string ipadd = Console.ReadLine(); Console.WriteLine(); Console.Write(please input the se

13、rver port:); int port = Convert.ToInt32(Console.ReadLine(); IPEndPoint ie = IPEndPoint(IPAddress.Parse(ipadd), port);/服務(wù)器的 IP和端口 try /因?yàn)榭蛻舳酥皇怯脕?lái)向特定的服務(wù)器發(fā)送信息,所以不需要綁定本機(jī)的IP 和端口。不需要監(jiān)聽。 newclient.(ie); catch (SocketException e) Console.WriteLine(unable to connect to server); Console.WriteLine(e.ToString();

14、 return; 20 int recv = newclient.(data); string stringdata = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringdata); while (true) string input = Console.ReadLine(); if (input = exit) break; newclient.(Encoding.ASCII.GetBytes(input); data = new byte1024; recv = newclient.(data); strin

15、gdata = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringdata); Console.WriteLine(disconnect from sercer); newclient.(SocketShutdown.Both); newclient.(); 21 無(wú)連接的套接字系統(tǒng)UDP 22 例:examplesocketUDPUDPChat1 23 操作: 1.打開過(guò)個(gè)聊天窗口,在不同的窗口中修改“本機(jī)端口號(hào)”,點(diǎn)擊“本機(jī)綁 定”按鈕 下面的任務(wù): 創(chuàng)建一個(gè)Socket和本地IP和端口號(hào)綁定,這樣才能接收數(shù)據(jù)

16、。 創(chuàng)建一個(gè)遠(yuǎn)程端點(diǎn),記錄聊天對(duì)象的IP和端口 啟動(dòng)接收線程,使用ReceiveFrom()方法,從遠(yuǎn)程計(jì)算機(jī)接收數(shù)據(jù) private void button1_Click(object sender, EventArgs e) localIpep = new IPEndPoint(IPAddress.Any, Convert.ToInt32(textBox1.Text);/本機(jī)端口號(hào) localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); localSocket. to

17、olStripStatusLabel1.Text = 正在監(jiān)聽.; remote = new IPEndPoint(IPAddress.Parse(textBox2.Text),Convert.ToInt32(textBox3.Tex t);/聊天對(duì)象的IP和端口號(hào) remote1 = (EndPoint)remote; 24 /啟動(dòng)接收線程/ if (thread != null) thread.Abort();/修改聊天對(duì)象的信息后,重新 try catch (Exception err) MessageBox.Show(err.ToString(); button1.Enabled =

18、false; 25 void receive() byte data = new byte1024; while (true) int recvCounts = (data, ref ); string str1 = System.Text.Encoding.BigEndianUnicode.GetString(data,0,recvCounts); textBox4.Text = textBox4.Text +rn+ str1; 注意: remote1傳來(lái)的信息,而是所有發(fā)送到本機(jī)(IP+端 口號(hào))的信息都可以接受,與前面的Bind方法有關(guān)。第二個(gè)參數(shù)無(wú)意義。 26 2.輸入姓名和聊天內(nèi)容后

19、點(diǎn)“發(fā)送”按鈕 private void button2_Click(object sender, EventArgs e) string strSend; byte data=new byte1024; strSend = textBox5.Text+: + textBox6.Text; data = System.Text.(strSend); localSocket.(data, data.Length, SocketFlags.None, ); textBox4.Text = textBox4.Text + rn + strSend; 27 3.點(diǎn)擊“修改”按鈕,修改聊天對(duì)象 private void butto

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論