青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

山寨:不是最好的,是最適合我們的!歡迎體驗(yàn)山寨 中文版MSDN

Blog @ Blog

當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見。 -- 聶魯達(dá)

常用鏈接

統(tǒng)計

積分與排名

BBS

Blog

Web

最新評論

基于C#的Socket開發(fā)快速入門

首先從原理上解釋一下采用Socket接口的網(wǎng)絡(luò)通訊,這里以最常用的C/S模式作為范例,首先,服務(wù)端有一個進(jìn)程(或多個進(jìn)程)在指定的端口等待客戶來 連接,服務(wù)程序等待客戶的連接信息,一旦連接上之后,就可以按設(shè)計的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸。客戶端在需要的時刻發(fā)出向服務(wù)端的連接請求。這里為 了便于理解,提到了一些調(diào)用及其大致的功能。使用socket調(diào)用后,僅產(chǎn)生了一個可以使用的socket描述符,這時還不能進(jìn)行通信,還要使用其他的調(diào) 用,以使得socket所指的結(jié)構(gòu)中使用的信息被填寫完。

  在使用TCP協(xié)議時,一般服務(wù)端進(jìn)程先使用socket調(diào)用得到一個描述 符,然后使用bind調(diào)用將一個名字與socket描述符連接起來,對于Internet域就是將Internet地址聯(lián)編到socket。之后,服務(wù)端 使用listen調(diào)用指出等待服務(wù)請求隊(duì)列的長度。然后就可以使用accept調(diào)用等待客戶端發(fā)起連接,一般是阻塞等待連接,一旦有客戶端發(fā)出連接, accept返回客戶的地址信息,并返回一個新的socket描述符,該描述符與原先的socket有相同的特性,這時服務(wù)端就可以使用這個新的 socket進(jìn)行讀寫操作了。一般服務(wù)端可能在accept返回后創(chuàng)建一個新的進(jìn)程進(jìn)行與客戶的通信,父進(jìn)程則再到accept調(diào)用處等待另一個連接。客 戶端進(jìn)程一般先使用socket調(diào)用得到一個socket描述符,然后使用connect向指定的服務(wù)器上的指定端口發(fā)起連接,一旦連接成功返回,就說明 已經(jīng)建立了與服務(wù)器的連接,這時就可以通過socket描述符進(jìn)行讀寫操作了。

  .NetFrameWork為Socket通訊提供了System.Net.Socket命名空間,在這個命名空間里面有以下幾個常用的重要類分別是:

  ·Socket類 這個低層的類用于管理連接,WebRequest,TcpClient和UdpClient在內(nèi)部使用這個類。

  ·NetworkStream類 這個類是從Stream派生出來的,它表示來自網(wǎng)絡(luò)的數(shù)據(jù)流

  ·TcpClient類 允許創(chuàng)建和使用TCP連接

  ·TcpListener類 允許監(jiān)聽傳入的TCP連接請求

  ·UdpClient類 用于UDP客戶創(chuàng)建連接(UDP是另外一種TCP協(xié)議,但沒有得到廣泛的使用,主要用于本地網(wǎng)絡(luò))

  下面我們來看一個基于Socket的雙機(jī)通信代碼的C#版本

  首先創(chuàng)建Socket對象的實(shí)例,這可以通過Socket類的構(gòu)造方法來實(shí)現(xiàn):

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); 

  其中,addressFamily 參數(shù)指定 Socket 使用的尋址方案,socketType 參數(shù)指定 Socket 的類型,protocolType 參數(shù)指定 Socket 使用的協(xié)議。

  下面的示例語句創(chuàng)建一個 Socket,它可用于在基于 TCP/IP 的網(wǎng)絡(luò)(如 Internet)上通訊。

Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

  若要使用 UDP 而不是 TCP,需要更改協(xié)議類型,如下面的示例所示:

Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

   一旦創(chuàng)建 Socket,在客戶端,你將可以通過Connect方法連接到指定的服務(wù)器(你可以在Connect方法前Bind端口,就是以指定的端口 發(fā)起連接,如果不事先Bind端口號的話,系統(tǒng)會默認(rèn)在1024到5000隨機(jī)綁定一個端口號),并通過Send方法向遠(yuǎn)程服務(wù)器發(fā)送數(shù)據(jù),而后可以通過 Receive從服務(wù)端接收數(shù)據(jù);而在服務(wù)器端,你需要使用Bind方法綁定所指定的接口使Socket與一個本地終結(jié)點(diǎn)相聯(lián),并通過Listen方法偵 聽該接口上的請求,當(dāng)偵聽到用戶端的連接時,調(diào)用Accept完成連接的操作,創(chuàng)建新的Socket以處理傳入的連接請求。使用完 Socket 后,使 用 Close 方法關(guān)閉 Socket。

  可以看出,以上許多方法包含EndPoint類型的參數(shù),在Internet中, TCP/IP 使用一個網(wǎng)絡(luò)地址和一個服務(wù)端口號來唯一標(biāo)識設(shè)備。網(wǎng)絡(luò)地址標(biāo)識網(wǎng)絡(luò)上的特定設(shè)備;端口號標(biāo)識要連接到的該設(shè)備上的特定服務(wù)。網(wǎng)絡(luò)地址和服 務(wù)端口的組合稱為終結(jié)點(diǎn),在 .NET 框架中正是由 EndPoint 類表示這個終結(jié)點(diǎn),它提供表示網(wǎng)絡(luò)資源或服務(wù)的抽象,用以標(biāo)志網(wǎng)絡(luò)地址等信 息。.Net同時也為每個受支持的地址族定義了 EndPoint 的子代;對于 IP 地址族,該類為 IPEndPoint。IPEndPoint  類包含應(yīng)用程序連接到主機(jī)上的服務(wù)所需的主機(jī)和端口信息,通過組合服務(wù)的主機(jī)IP地址和端口號,IPEndPoint 類形成到服務(wù)的連接點(diǎn)。

  用到IPEndPoint類的時候就不可避免地涉及到計算機(jī)IP地址,System.Net命名空間中有兩種類可以得到IP地址實(shí)例:

  ·IPAddress類:IPAddress 類包含計算機(jī)在 IP 網(wǎng)絡(luò)上的地址。其Parse方法可將 IP 地址字符串轉(zhuǎn)換為 IPAddress 實(shí)例。下面的語句創(chuàng)建一個 IPAddress 實(shí)例:

IPAddress myIP = IPAddress.Parse("192.168.0.1"); 

   需要知道的是:Socket 類支持兩種基本模式:同步和異步。其區(qū)別在于:在同步模式中,按塊傳輸,對執(zhí)行網(wǎng)絡(luò)操作的函數(shù)(如 Send 和  Receive)的調(diào)用一直等到所有內(nèi)容傳送操作完成后才將控制返回給調(diào)用程序。在異步模式中,是按位傳輸,需要指定發(fā)送的開始和結(jié)束。同步模式是最常 用的模式,我們這里的例子也是使用同步模式。

// 客戶端

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace ClientDemo
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
try
         
{
            
int port = 2010;
            
string host = "127.0.0.1";
            IPAddress ip 
= IPAddress.Parse(host);
            IPEndPoint ipe 
= new IPEndPoint(ip, port);//把ip和端口轉(zhuǎn)化為IPEndPoint實(shí)例
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創(chuàng)建一個Socket
            Console.WriteLine("Conneting");
            c.Connect(ipe);
//連接到服務(wù)器
            string sendStr = "hello!This is a socket test";
            
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
            Console.WriteLine(
"Send Message");
            c.Send(bs, bs.Length, 
0);//發(fā)送測試信息
            string recvStr = "";
            
byte[] recvBytes = new byte[1024];
            
int bytes;
            bytes 
= c.Receive(recvBytes, recvBytes.Length, 0);//從服務(wù)器端接受返回信息
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
            Console.WriteLine(
"Client Get Message:{0}", recvStr);//顯示服務(wù)器返回信息
                c.Close();
         }

         
catch (ArgumentNullException e)
         
{
            Console.WriteLine(
"ArgumentNullException: {0}", e);
         }

         
catch (SocketException e)
         
{
            Console.WriteLine(
"SocketException: {0}", e);
         }

     Console.WriteLine(
"Press Enter to Exit");
        Console.ReadLine();

      }

    }

}

服務(wù)端:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace ServerDemo
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
try 
            
{
                
int port = 2010;
                
string host = "127.0.0.1";
                IPAddress ip 
= IPAddress.Parse(host);
                IPEndPoint ipe 
= new IPEndPoint(ip, port);
                Socket s 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 創(chuàng)建一個SOKCET類的實(shí)例
                s.Bind(ipe);    // 綁定端口
                s.Listen(0);    // 開始監(jiān)聽
                Console.WriteLine("Wait for connect");
                Socket temp 
= s.Accept();// 為新建連接創(chuàng)建新的Socket
                Console.WriteLine("Get a Connect");
                
string recvStr = "";
                
byte[] recvBytes = new byte[1024];
                
int bytes;
                bytes 
= temp.Receive(recvBytes, recvBytes.Length, 0);   //  接收客戶端的信息
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine(
"Server Get Message:{0}", recvStr);

                
string sendStr = "OK! Client Send Message Successful!";
                
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                temp.Send(bs, bs.Length, 
0);
                temp.Close();
                s.Close();
            }

            
catch (ArgumentNullException e)
         
{
            Console.WriteLine(
"ArgumentNullException: {0}", e);
         }

         
catch (SocketException e)
         
{
            Console.WriteLine(
"SocketException: {0}", e);
         }

         Console.WriteLine(
"Press Enter to Exit");
         Console.ReadLine();
        }

    }

}


面的例子是用的Socket類,System.Net.Socket命名空間還提供了兩個抽象高級類TCPClient和UDPClient和用于通訊流處理的NetWorkStream,讓我們看下例子

  客戶端

TcpClient tcpClient=new TcpCLient(主機(jī)IP,端口號);
NetworkStream ns=tcp.Client.GetStream();

  服務(wù)端

TcpListener tcpListener=new TcpListener(監(jiān)聽端口);
tcpListener.Start();
TcpClient tcpClient=tcpListener.AcceptTcpClient();
NetworkStream ns=tcpClient.GetStream();

  服務(wù)端用TcpListener監(jiān)聽,然后把連接的對象實(shí)例化為一個TcpClient,調(diào)用TcpClient.GetStream()方法,返回網(wǎng)絡(luò)流實(shí)例化為一個NetworlStream流,下面就是用流的方法進(jìn)行Send,Receive

   如果是UdpClient的話,就直接UdpClient實(shí)例化,然后調(diào)用UdpClient的Send和Receive方法,需要注意的事, UdpClient沒有返回網(wǎng)絡(luò)流的方法,就是說沒有GetStream方法,所以無法流化,而且使用Udp通信的時候,不要服務(wù)器監(jiān)聽。

  現(xiàn)在我們大致了解了.Net Socket通信的流程,下面我們來作一個稍微復(fù)雜點(diǎn)的程序,一個廣播式的C/S聊天程序。

  客戶端設(shè)計需要一個1個ListBox,用于顯示聊天內(nèi)容,一個TextBox輸入你要說的話,一個Button發(fā)送留言,一個Button建立連接。

  點(diǎn)擊建立連接的Button后出來一個對話框,提示輸入連接服務(wù)器的IP,端口,和你的昵稱,啟動一個接受線程,負(fù)責(zé)接受從服務(wù)器傳來的信息并顯示在ListBox上面。

  服務(wù)器端2個Button,一個啟動服務(wù),一個T掉已建立連接的客戶端,一個ListBox顯示連接上的客戶端的Ip和端口。

  比較重要的地方是字符串編碼的問題,需要先把需要傳送的字符串按照UTF8編碼,然后接受的時候再還原成為GB2312,不然中文顯示會是亂碼。

  還有一個就是接收線程,我這里簡單寫成一個While(ture)循環(huán),不斷判斷是否有信息流入,有就接收,并顯示在ListBox上,這里有問題,在.Net2.0里面,交錯線程修改窗體空間屬性的時候會引發(fā)一個異常,不可以直接修改,需要定義一個委托來修改。

   當(dāng)客戶端需要斷開連接的時候,比如點(diǎn)擊窗體右上角的XX,就需要定義一個this.FormClosing +=  new System.Windows.Forms.FormClosingEventHandler(this.Closing);(.Net2.0 是FormClosing系統(tǒng)事件),在Closing()函數(shù)里面,發(fā)送Close字符給服務(wù)端,服務(wù)器判斷循環(huán)判斷所有的連接上的客戶端傳來的信息, 如果是以Close開頭,斷開與其的連接。看到這里,讀者就會問了,如果我在聊天窗口輸入Close是不是也斷開連接呢?不是的,在聊天窗口輸入的信息傳 給服務(wù)器的時候開頭都要加上Ip信息和昵稱,所以不會沖突。 


本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/dzfb/archive/2006/12/21/1452139.aspx

posted on 2009-11-30 19:17 isabc 閱讀(1810) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


廣告信息(免費(fèi)廣告聯(lián)系)

中文版MSDN:
歡迎體驗(yàn)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩一区二区精品| 久久婷婷亚洲| 新狼窝色av性久久久久久| 国产精品久久久久久久一区探花| 老司机午夜精品视频| 美女性感视频久久久| 亚洲成人在线视频播放| 亚洲黄色在线| 欧美日韩午夜剧场| 欧美亚洲日本国产| 欧美大秀在线观看| 亚洲午夜小视频| 国精产品99永久一区一区| 噜噜爱69成人精品| 亚洲性图久久| 久久这里只有| 中文一区二区| 国内精品嫩模av私拍在线观看| 免费看av成人| 亚洲女ⅴideoshd黑人| 欧美大片一区二区三区| 亚洲一区在线免费观看| 好看的日韩视频| 国产精品v日韩精品v欧美精品网站| 久久福利电影| 99在线热播精品免费99热| 免播放器亚洲一区| 91久久黄色| 国产欧美日韩亚洲| 蜜桃久久精品乱码一区二区| 亚洲一区二区免费看| 欧美大片第1页| 欧美一区二区三区免费在线看 | 久久精品国产精品亚洲综合| 最新日韩欧美| 国产一区三区三区| 国产精品久久午夜| 欧美~级网站不卡| 欧美一区亚洲一区| 一本色道久久综合一区| 免费在线观看成人av| 久久aⅴ国产紧身牛仔裤| 一区二区三区精品视频| 亚洲国产精品一区二区久| 国产日韩欧美成人| 欧美三区免费完整视频在线观看| 久久久久久久一区| 午夜精品亚洲一区二区三区嫩草| 亚洲最新在线视频| 亚洲国产综合在线| 亚洲国产aⅴ天堂久久| 看片网站欧美日韩| 久久精品久久99精品久久| 亚洲欧美激情精品一区二区| 一本一本久久a久久精品综合妖精| 亚洲高清视频一区二区| 伊人成年综合电影网| 国产一区二区精品丝袜| 国产精品一区二区a| 国产精品久久久一本精品| 欧美日韩日日夜夜| 欧美日韩伦理在线| 欧美日韩国产一区二区三区| 欧美黑人在线播放| 欧美精品日韩综合在线| 欧美大香线蕉线伊人久久国产精品| 久久久久综合| 免费在线观看精品| 欧美.日韩.国产.一区.二区| 女主播福利一区| 欧美精品尤物在线| 欧美日本国产视频| 欧美日韩亚洲高清一区二区| 欧美日韩亚洲91| 国产精品久久激情| 国产精品丝袜xxxxxxx| 国产欧美精品国产国产专区| 国产欧美精品日韩| 国内精品久久久久伊人av| 在线成人亚洲| 亚洲精品一区二区在线观看| 99综合在线| 亚洲综合成人婷婷小说| 欧美伊人影院| 美日韩精品免费观看视频| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美国产免费| 亚洲国产99精品国自产| 99国产精品一区| 亚洲女同同性videoxma| 久久大逼视频| 欧美wwwwww| 国产精品免费看片| 国内外成人在线| 亚洲精品一区久久久久久| 亚洲视频中文字幕| 欧美伊人影院| 欧美激情bt| 国产精品99久久久久久有的能看| 午夜精品久久久久久| 久久久久国产精品一区二区| 欧美精品少妇一区二区三区| 国产精品嫩草久久久久| 黄网站免费久久| 中文欧美字幕免费| 久久久久久久久蜜桃| 91久久夜色精品国产九色| 亚洲少妇最新在线视频| 久久婷婷丁香| 国产精品免费福利| 亚洲激情影视| 亚洲欧美日韩国产成人| 欧美国产综合视频| 亚洲欧美大片| 欧美国产成人精品| 国产欧美一区二区精品仙草咪| 亚洲国产91精品在线观看| 亚洲嫩草精品久久| 欧美黄在线观看| 午夜精品999| 欧美精品一区二区三区在线播放| 国产亚洲欧美日韩在线一区| 99精品视频一区二区三区| 久久午夜电影| 亚洲性图久久| 欧美另类videos死尸| 一色屋精品视频在线观看网站| 亚洲午夜在线观看视频在线| 亚洲大胆女人| 欧美在线观看一区二区| 国产精品分类| 夜夜嗨av一区二区三区网站四季av| 久热精品在线| 亚洲欧美一级二级三级| 欧美视频免费在线观看| 亚洲精品免费网站| 美日韩精品视频| 欧美一区二区三区在线免费观看| 欧美午夜一区二区| 夜夜嗨av一区二区三区免费区| 欧美福利网址| 久久亚洲欧洲| 精品动漫av| 久久人人97超碰国产公开结果| 亚洲综合国产激情另类一区| 欧美视频久久| 亚洲午夜精品17c| 久久综合99re88久久爱| 亚洲欧美日韩久久精品| 亚洲高清三级视频| 久久三级视频| 国产资源精品在线观看| 欧美一区二区三区在线| 日韩午夜激情| 欧美日本国产视频| 亚洲精品字幕| 亚洲国产经典视频| 欧美xxx成人| 亚洲精品综合| 亚洲日本电影| 欧美日韩另类在线| 一本色道久久88综合日韩精品| 91久久久久久久久| 欧美久色视频| 亚洲天天影视| 亚洲午夜精品一区二区三区他趣| 国产精品高潮久久| 欧美一区二区精品| 欧美在线一二三四区| 红桃视频欧美| 欧美高清视频免费观看| 嫩草伊人久久精品少妇av杨幂| 亚洲精品视频啊美女在线直播| 亚洲片在线资源| 欧美日韩一区二区国产| 性做久久久久久久免费看| 午夜精品久久久久久久久久久久| 国产精品一二三| 久久综合久久久| 欧美成ee人免费视频| 宅男噜噜噜66国产日韩在线观看| 一区二区高清视频在线观看| 国产精品久久久久久影院8一贰佰| 午夜精品理论片| 久久久999| 亚洲美女一区| 亚洲一区图片| 一区二区三区在线免费视频| 亚洲国产精品ⅴa在线观看| 欧美日韩三级视频| 久久久xxx| 欧美激情成人在线| 欧美一区二区三区免费视频| 久久久久免费| 一区二区三区视频观看| 午夜精品久久久久久久蜜桃app| 亚洲大片在线观看| 一本色道久久综合亚洲91| 激情国产一区二区| 亚洲精品偷拍|