這樣的寫法有點問題:
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;
}
}