Socket异步编程-之服务器端.
1 using System;
2 using System.Text;
3 using System.Threading;
4 using System.Net.Sockets;
5 using System.Net;
6 namespace asyncSocketServer {
7
8 class SocketListener {
9 System.Threading.ManualResetEvent allDone=new ManualResetEvent(false);
10 [STAThread]
11 static void Main(string[] args) {
12 SocketListener server=new SocketListener();
13 server.StartListening();
14 }
15
16 public void StartListening() {
17 IPHostEntry ipHostInfo=Dns.Resolve(Dns.GetHostName());
18 IPEndPoint localEP=new IPEndPoint(ipHostInfo.AddressList[0],11000);
19 Console.WriteLine("Local address and pot:{0}",localEP.ToString());
20 Socket listener=new Socket(AddressFamily.InterNetwork,
21 SocketType.Stream,ProtocolType.Tcp);
22 try {
23 listener.Bind(localEP);
24 listener.Listen(10);
25 while (true) {
26 allDone.Reset();
27 Console.WriteLine("Waiting for a connection");
28 listener.BeginAccept(new AsyncCallback(acceptCallback),listener);
29 allDone.WaitOne(); //阻塞主线程
30 }
31 }
32 catch(Exception ex) {
33 Console.WriteLine(ex.ToString());
34 }
35 Console.WriteLine("Closing the Listener.");
36 }
37
38 public void acceptCallback(IAsyncResult ar) {
39 Socket listener=(Socket)ar.AsyncState;
40 Socket handler=listener.EndAccept(ar);
41 //设置主线程继续
42 allDone.Set();
43 StateObject state=new StateObject();
44 state.workSocket=handler;
45 handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
46 new AsyncCallback(readCallback),state);
47 }
48
49 public void readCallback(IAsyncResult ar) {
50 StateObject state=(StateObject)ar.AsyncState;
51 Socket handler=state.workSocket;
52 int read=handler.EndReceive(ar);
53 if (read>0) {
54 state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
55 handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
56 new AsyncCallback(readCallback),state);
57 }
58 else {
59 if (state.sb.Length>1) {
60 string content=state.sb.ToString();
61 Console.WriteLine("Read {0} bytes from socket.\n Data:{1}",
62 content.Length,content);
63 }
64 handler.Close();
65 }
66 }
67 }
68
69 public class StateObject {
70 public Socket workSocket=null;
71 public const int BufferSize=1024;
72 public byte[] buffer=new byte[BufferSize];
73 public StringBuilder sb=new StringBuilder();
74 }
75 }
76
2 using System.Text;
3 using System.Threading;
4 using System.Net.Sockets;
5 using System.Net;
6 namespace asyncSocketServer {
7
8 class SocketListener {
9 System.Threading.ManualResetEvent allDone=new ManualResetEvent(false);
10 [STAThread]
11 static void Main(string[] args) {
12 SocketListener server=new SocketListener();
13 server.StartListening();
14 }
15
16 public void StartListening() {
17 IPHostEntry ipHostInfo=Dns.Resolve(Dns.GetHostName());
18 IPEndPoint localEP=new IPEndPoint(ipHostInfo.AddressList[0],11000);
19 Console.WriteLine("Local address and pot:{0}",localEP.ToString());
20 Socket listener=new Socket(AddressFamily.InterNetwork,
21 SocketType.Stream,ProtocolType.Tcp);
22 try {
23 listener.Bind(localEP);
24 listener.Listen(10);
25 while (true) {
26 allDone.Reset();
27 Console.WriteLine("Waiting for a connection");
28 listener.BeginAccept(new AsyncCallback(acceptCallback),listener);
29 allDone.WaitOne(); //阻塞主线程
30 }
31 }
32 catch(Exception ex) {
33 Console.WriteLine(ex.ToString());
34 }
35 Console.WriteLine("Closing the Listener.");
36 }
37
38 public void acceptCallback(IAsyncResult ar) {
39 Socket listener=(Socket)ar.AsyncState;
40 Socket handler=listener.EndAccept(ar);
41 //设置主线程继续
42 allDone.Set();
43 StateObject state=new StateObject();
44 state.workSocket=handler;
45 handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
46 new AsyncCallback(readCallback),state);
47 }
48
49 public void readCallback(IAsyncResult ar) {
50 StateObject state=(StateObject)ar.AsyncState;
51 Socket handler=state.workSocket;
52 int read=handler.EndReceive(ar);
53 if (read>0) {
54 state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
55 handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
56 new AsyncCallback(readCallback),state);
57 }
58 else {
59 if (state.sb.Length>1) {
60 string content=state.sb.ToString();
61 Console.WriteLine("Read {0} bytes from socket.\n Data:{1}",
62 content.Length,content);
63 }
64 handler.Close();
65 }
66 }
67 }
68
69 public class StateObject {
70 public Socket workSocket=null;
71 public const int BufferSize=1024;
72 public byte[] buffer=new byte[BufferSize];
73 public StringBuilder sb=new StringBuilder();
74 }
75 }
76
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。