當前位置:編程學習大全網 - 編程語言 - 關於c#的Socket異步網絡編程問題

關於c#的Socket異步網絡編程問題

這樣的寫法有點問題:

1)服務器端既然采用了異步方式Accept,就沒有必要再啟線程

2)估計allDone是壹個ManualResetEvent。用ManualResetEvent的目的什麽呢?

服務器端采用異步Accept的代碼其實很簡單,也不需要ManualResetEvent同步

public?class?AppTCPServer

{

public?AppTCPServer(string?localIP,?int?port)

{

Socket?socket?=?new?Socket(AddressFamily.InterNetwork,?

SocketType.Stream,?

ProtocolType.Tcp);

EndPoint?localEP?=?new?IPEndPoint(IPAddress.Parse(localIP),?port);

socket.Bind(localEP);

socket.Listen(100);

socket.BeginAccept(AcceptAsync,?socket);

}

private?void?AcceptAsync(IAsyncResult?ar)

{

Socket?socket?=?ar.AsyncState?as?Socket;

try

{

Socket?client?=?socket.EndAccept(ar);

Console.WriteLine("客戶端連接成功!客戶端:{0}",?client.RemoteEndPoint.ToString());

if?(OnConnected?!=?null)

{

OnConnected(this,?new?ClientConnectedEventArgs(client));

}

}

catch?(Exception?e)

{

Console.WriteLine("AcceptAsync發生異常,異常信息:\n{0}",?e.Message);

}

finally

{

//繼續異步Accept

socket.BeginAccept(AcceptAsync,?socket);

}

}

//客戶端連接後的事件?OnConnect

public?event?EventHandler<ClientConnectedEventArgs>?OnConnected;

}

///?<summary>

///?事件參數:接收客戶端連接後的事件參數

///?</summary>

public?class?ClientConnectedEventArgs?:?EventArgs

{

public?ClientConnectedEventArgs(Socket?clientSocket)

{

ClientSocket?=?clientSocket;

}

public?Socket?ClientSocket?{?get;?private?set;?}

}

class?Program

{

static?void?Main(string[]?args)

{

AppTCPServer?server?=?new?AppTCPServer("127.0.0.01",?8000);

server.OnConnected?+=?server_OnConnected;

Console.WriteLine("按任意鍵結束程序……");

Console.ReadKey();

}

static?void?server_OnConnected(object?sender,?ClientConnectedEventArgs?e)

{

Socket?client?=?e.ClientSocket;

string?hello?=?"Hello?from?AppTCPServer";

client.Send(Encoding.Default.GetBytes(hello));

}

} 客戶端測試程序

class?Program

{

static?void?Main(string[]?args)

{

//模擬100個客戶連接服務器

for?(int?i?=?0;?i?<?100;?i++)

{

Socket?socket?=?ConnectToServer("127.0.0.1",?8000);

byte[]?buffer?=?new?byte[1024];

int?bytesRecevied?=?socket.Receive(buffer,?buffer.Length,?SocketFlags.None);

byte[]?messageBytes?=?new?byte[bytesRecevied];

Array.Copy(buffer,?messageBytes,?bytesRecevied);

Console.WriteLine(Encoding.Default.GetString(messageBytes));

socket.Disconnect(false);

socket.Close();

}

Console.ReadKey();

static?Socket?ConnectToServer(string?serverIP,?int?serverPort)

{

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

EndPoint?localEP?=?new?IPEndPoint(IPAddress.Any,?0);

socket.Bind(localEP);

socket.Connect(new?IPEndPoint(IPAddress.Parse(serverIP),?serverPort));

return?socket;

}

}

  • 上一篇:大數據時代的背景
  • 下一篇:天津室內裝修水電承包材料多少錢壹平米?
  • copyright 2024編程學習大全網