建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

云頂集團有多少賭場:以異步的方式操作TCPIP套接字——以異步方式實現簡單的聊天室

?

通俗的TCP/IP開拓要領大年夜家都應該異常純熟,但在系統開拓的時刻每每會碰到問題。

比如:在開拓一個簡單的談天室的時刻,一樣平常環境下,Windows利用法度榜樣會處于同步要領運行,當監聽的客戶端越多,辦事器的負荷將會越重,信息發送與接管都邑受到影響。這時刻,我們就應該考試測驗應用異步的TCP/IP通訊來緩解辦事器的壓力。

下面以一個最簡單的談天室辦事器真個例子來闡明異步TCP/IP的威力,先開拓一個ChatClient類作為客戶治理的代理類,每當辦事器接管到信息時,就會把信息處置懲罰并發送給每一個在線客戶。

void Main()

{

IPAddress ipAddress = IPAddress.Parse("127.0.0.1" );//默認地址

TcpListener tcpListener = new TcpListener(ipAddress,500 );

tcpListener.Start();

while (isListe云頂集團有多少賭場n)//以一個逝世輪回來實現監聽

{

ChatClient chatClient = new ChatClient(tcpListener.AcceptTcpClient());//調用一個ChatClient工具來實現監聽

}

tcpListener.Stop();

}

ChatClient中存在著一個Hashtabel類的靜態變量 clients,此變量用來存貯在線的客戶端信息,每當對一個客戶端進行監聽時,系統就天生一個ChatClient工具,然后在變量clients中加入此客戶真個信息。在接管客戶端信息時,信息會調用Receive(IAsyncResult async)措施,把接管到的信息發送給每一個在線客戶。

值得留意的是,每當接管到客戶信息時,系統都邑使用Stream.BeginRead()的措施去接管信息,然后把信息發送到每一個在線客戶,這樣做就可以使用異步的要領把信息進行接管,從而令主線程趕早獲得開釋,前進系統的機能。

public class ChatClient

{

private TcpClient _tcpClient;

private byte [] byteMessage;

private string _clientEndPoint;

public volatile string message;

public static Hashtable clients= new Hashtable();//以此靜態變量存處多個客戶端地址

public ChatClient(TcpClient tcpClient)

{

_tcpClient = tcpClient;

_clientEndPoint = _tcpClient.Client.RemoteEndPoint.ToString();

Console.WrtieLine("連接成功,客戶端EndPoint為"+_clientEndPoint);

ChatClient.clients.Add(_clientEndPoint, this );//每創建一個工具,就會將客戶真個ChatClient工具存入clients;

byteMessage=new byte [_tcpClient.ReceiveBufferSize];

lock (_tcpClient.GetStream())//接管信息,應云頂集團有多少賭場用lock避免數據沖突

{

_tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null);

//就在此處應用異步的IO線程進行數據讀取,這樣每個一客戶真個都處于一個IO線程中處置懲罰,使主線程趕早獲得開釋

//這樣做就緩解了辦事器端壓力。

}

}

public void Receive(IAsyncResult iAsyncResult)

{

try

{

int length;

lock (_tcpClient.GetStream())//信息接管,應用lock避免數據沖突

{

length= _tcpClient.GetStream().EndRead(iAsyncResult);

}

if (length)

{

MessageBox.Show(_tcpClient.Client.RemoteEndPoint + "已經斷線" );

clients.Remove(_tcpC云頂集團有多少賭場lient);

return ;

}

message=Encoding.Unicode.GetString(byteMessage,0 ,length);

SendToEveryone(message);

//在此時我們可以在此處調用SendToEveryone措施,使用clients變量以Stream.Write措施為每個客戶端發送信息。

lock (_tcpClient.GetStream())//再次監聽,應用lock避免數據沖突

{

_tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null );

//再次調用Stream.BeginRead措施,以監聽以下次客戶的信息

}

}

catch (Exception ex)

{

clients.Remove(_tcpClient);

_tcpClient.GetStream().Close();

_tcpClient.Close();

}

}

//經由過程Send措施把信息轉換成二進制數據,然后發送到客戶端

public void Send(string message)

{

try

{

NetworkStream ns;

lock (_tcpClient.GetStream())

{

ns = _tcpClient.GetStream();

}

byte[] byteMessage = Encoding.ASCII.GetBytes(message);

ns.Write(by云頂集團有多少賭場teMessage, 0, byteMessage.Length);

ns.Flush();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

//因為客戶端信息記錄在HashTabel變量clients中,當信息接管后,就會經由過程此變量把信息發送給每一個在線客戶。

public void SendToEveryone(string message)

{

foreach (DictionaryEntry client in clients)

{

ChatClient chatClient = (ChatClient)client.Value;

chatClient.Send(message);

}

}

}

測試結果:

至于窗口的設計和客戶真個設計在這里就省略不說,這里的目的只是要你懂得辦事器端多線程TCP/IP信息接管的道理。

這個例子里,ChatClient類應用異步的IO線程進行數據讀取,這樣每個一客戶真個都處于一個IO線云頂集團有多少賭場程中處置懲罰,使主線程趕早獲得開釋,這樣做就緩解了辦事器端壓力。

這時刻你可以做一個測試,此談天室在默認環境下可吸收大年夜約3000個客戶端連接,仍舊能夠正常事情。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
13号云南十一选五 新快3江苏 山东快乐扑克3豹子遗漏 足球指数即时比分 球探网足球比分直播 广西11选5首尾连号法是什么意思 单机捕鱼达人2破解版 加拿大快乐8数据网站 竞彩篮球胜分差是什么意思 广东25选5开奖结果查询