续实例解析SOCKET编程模型之异步通信篇(上)


.NET 框架的 Socket 类实际上是 Winsock32 API 提供的套接字服务的托管代码版本。其中Socket 类为网络通信提供了一套丰富的方法和属性,大多数情况下,Socket 类方法只是将数据封送到它们的本机Win32 副本中并处理任何必要的安全检查。Socket 类允许使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。Socket 类遵循异步方法的 .NET Framework 命名模式;例如,同步 Receive 方法对应于异步 BeginReceive 和 EndReceive 方法。

事实上Socket可以象流Stream一样被视为一个应用程序端(客户端)和远程服务器端之间数据通道,通过这个通道来对数据进行读取(接收)和写入(发送)。

异步模式所提供的革新之一就是调用方确定特定调用是否应是异步的。对于被调用的对象,没有必要执行附加的编程来用于支持其客户端的异步行为;在该模式中异步委托提供此功能。

如果应用程序在执行期间只需要一个线程,请使用我在《实例解析SOCKET编程模型》中介绍的方法,这些方法适用于单线程同步操作模式。同步操作模式对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。

若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。异步操作模式对执行网络操作的函数的调用立即返回。

如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。

如果当前使用的是无连接协议(如 UDP),则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。

当数据发送和数据接收完成之后,可使用 Shutdown 方法来禁用 Socket。在调用 Shutdown 之后,可调用 Close 方法来释放与 Socket 关联的所有资源。

Socket 类允许使用 SetSocketOption 方法来配置 Socket。可使用 GetSocketOption 方法来检索这些设置。

注意 如果编写较简单的应用程序,而且只需同步数据传输,则可以考虑使用 TcpClient、TcpListener 和 UdpClient。这些类为 Socket 通信提供了更简单、对用户更友好的接口。

从TCP/IP模型上来看, 像 System.Net命名空间中的HttpWebReqeust类和HttpWebResponse类属于请求/响应层。TcpClient、TcpListener 和 UdpClient这些类属于应用协议层,处中间。而Socket类处于传输层,是最底层。当其上面的请求/响应层和应用协议层不能满足应用程序的特殊需要时,就需要使用传输层进行Socket套接字编程。


异步服务器套接字使用 .NET Framework 异步编程模型处理网络服务请求。Socket 类遵循标准 .NET Framework 异步命名模式;例如,同步 Accept 方法对应异步 BeginAccept 和 EndAccept 方法。

异步服务器套接字需要一个开始接受网络连接请求的方法,一个处理连接请求并开始接收网络数据的回调方法以及一个结束接收数据的回调方法。本节将进一步讨论所有这些方法。

在下面的源码中,为开始接受网络连接请求,方法 StartListening 初始化 Socket,然后使用 BeginAccept 方法开始接受新连接。当套接字上接收到新连接请求时,将调用接受回调方法。它负责获取将处理连接的 Socket 实例,并将 Socket 提交给将处理请求的线程。接受回调方法实现 AsyncCallback 委托;它返回 void,并带一个 IAsyncResult 类型的参数。下面的示例是接受回调方法的外壳程序: private void AcceptCallBack(IAsyncResult ar){}

BeginAccept 方法带两个参数:指向接受回调方法的 AsyncCallback 委托和一个用于将状态信息传递给回调方法的对象。在下面的示例中,侦听 Socket 通过状态参数传递给回调方法。本示例创建一个 AsyncCallback 开始一个异步操作来接受一个传入的连接尝试 listeningSocket.BeginAccept(new AsyncCallback(AcceptCallBack),listeningSocket);//

异步套接字使用系统线程池中的线程处理传入的连接。一个线程负责接受连接,另一线程用于处理每个传入的连接,还有一个线程负责接收连接数据。这些线程可以是同一个线程,具体取决于线程池所分配的线程。System.Threading.ManualResetEvent 类挂起主线程的执行并在执行可以继续时发出信号。

接受回调方法(即前例中的 acceptCallback)负责向主应用程序发出信号,让它继续执行处理、建立与客户端的连接并开始异步读取客户端数据。下面的示例是 acceptCallback 方法实现的第一部分。该方法的此节向主应用程序线程发出信号,让它继续处理并建立与客户端的连接。

开始从客户端套接字接收数据的 acceptCallback 方法的此节首先初始化 StateObject 类的一个实例,然后调用 BeginReceive 方法以开始从客户端套接字异步读取数据。需要为异步套接字服务器实现的 final 方法是返回客户端发送的数据的读取回调方法。与接受回调方法一样,读取回调方法也是一个 AsyncCallback 委托。该方法将来自客户端套接字的一个或多个字节读入数据缓冲区,然后再次调用 BeginReceive 方法,直到客户端发送的数据完成为止。

创建线程时,将使用采用 ThreadStart 委托作为其唯一参数的构造函数创建 Thread 类的新实例。但线程在调用 Start 方法前不会开始执行。调用 Start 后,将从由 ThreadStart 委托引用的方法的第一行开始执行。如下例所示: Thread thread=new Thread(new ThreadStart(ThreadProc));

thread.Start();


在以下的源码中我们使用了ManualResetEvent 来允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

当线程开始一个活动(此活动必须在其他线程进行之前完成)时,它调用 Reset 将 ManualResetEvent 设置为非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻塞,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。

一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。

可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。


C# socket编程_buffer//

以下是异步聊天服务器端详细实现方法 

C# socket编程_buffer


C# socket编程_buffer

using  System; 

C# socket编程_buffer

using  System.Drawing; 

C# socket编程_buffer

using  System.Collections; 

C# socket编程_buffer

using  System.ComponentModel; 

C# socket编程_buffer

using  System.Windows.Forms; 

C# socket编程_buffer

using  System.Data; 

C# socket编程_buffer

using  System.Net; 

C# socket编程_buffer

using  System.Net.Sockets; 

C# socket编程_buffer

using  System.Threading; 

C# socket编程_buffer

using  System.Text; 

C# socket编程_buffer

namespace  聊天_socket 

C# socket编程_thread_14C# socket编程_c#_15

... { 

C# socket编程_buffer_16C# socket编程_服务器_17/**//// <summary> 

C# socket编程_buffer_18/// Form1 的摘要说明。 

C# socket编程_socket_19/// </summary> 

C# socket编程_buffer_18public class Form1 : System.Windows.Forms.Form 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18private System.Windows.Forms.StatusBar statusBar1; 

C# socket编程_buffer_18private System.Windows.Forms.Label label1; 

C# socket编程_buffer_18private System.Windows.Forms.Label label2; 

C# socket编程_buffer_18private System.Windows.Forms.Label label3; 

C# socket编程_buffer_18private System.Windows.Forms.Label label4; 

C# socket编程_buffer_18private System.Windows.Forms.RichTextBox rtbReceive; 

C# socket编程_buffer_18private System.Windows.Forms.RichTextBox rtbSend; 

C# socket编程_buffer_18private System.Windows.Forms.TextBox txtServer; 

C# socket编程_buffer_18private System.Windows.Forms.TextBox txtPort; 

C# socket编程_buffer_18private System.Windows.Forms.Button btnListen; 

C# socket编程_buffer_18private System.Windows.Forms.Button btnSend; 

C# socket编程_buffer_18private System.Windows.Forms.Button btnStop; 

C# socket编程_buffer_18private IPAddress hostIPAddress=IPAddress.Parse("127.0.0.1"); 

C# socket编程_buffer_18private IPEndPoint Server; 

C# socket编程_buffer_18private Socket listeningSocket; 

C# socket编程_buffer_18private Socket handler; 

C# socket编程_buffer_18private Socket mySocket; 

C# socket编程_buffer_18private static ManualResetEvent Done=new ManualResetEvent(false); 

C# socket编程_buffer_18private const int BufferSize=256; 

C# socket编程_buffer_18private byte[] buffer=new byte[BufferSize]; 

C# socket编程_buffer_18string port; 

C# socket编程_buffer_16C# socket编程_服务器_17/**//// <summary> 

C# socket编程_buffer_18/// 必需的设计器变量。 

C# socket编程_socket_19/// </summary> 

C# socket编程_buffer_18private System.ComponentModel.Container components = null; 

C# socket编程_buffer_18

C# socket编程_buffer_18public Form1() 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// Windows 窗体设计器支持所必需的 

C# socket编程_buffer_18// 

C# socket编程_buffer_18InitializeComponent(); 

C# socket编程_buffer_18

C# socket编程_buffer_18// 

C# socket编程_buffer_18// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 

C# socket编程_buffer_18// 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_16C# socket编程_服务器_17/**//// <summary> 

C# socket编程_buffer_18/// 清理所有正在使用的资源。 

C# socket编程_socket_19/// </summary> 

C# socket编程_buffer_18protected override void Dispose( bool disposing ) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18if( disposing ) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18if (components != null) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18components.Dispose(); 

C# socket编程_socket_19

C# socket编程_socket_19

C# socket编程_buffer_18base.Dispose( disposing ); 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_服务器_17C# socket编程_buffer_16Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码 

C# socket编程_buffer_16C# socket编程_服务器_17/**//// <summary> 

C# socket编程_buffer_18/// 设计器支持所需的方法 - 不要使用代码编辑器修改 

C# socket编程_buffer_18/// 此方法的内容。 

C# socket编程_socket_19/// </summary> 

C# socket编程_buffer_18private void InitializeComponent() 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18this.rtbReceive = new System.Windows.Forms.RichTextBox(); 

C# socket编程_buffer_18this.rtbSend = new System.Windows.Forms.RichTextBox(); 

C# socket编程_buffer_18this.txtServer = new System.Windows.Forms.TextBox(); 

C# socket编程_buffer_18this.txtPort = new System.Windows.Forms.TextBox(); 

C# socket编程_buffer_18this.statusBar1 = new System.Windows.Forms.StatusBar(); 

C# socket编程_buffer_18this.btnListen = new System.Windows.Forms.Button(); 

C# socket编程_buffer_18this.btnSend = new System.Windows.Forms.Button(); 

C# socket编程_buffer_18this.btnStop = new System.Windows.Forms.Button(); 

C# socket编程_buffer_18this.label1 = new System.Windows.Forms.Label(); 

C# socket编程_buffer_18this.label2 = new System.Windows.Forms.Label(); 

C# socket编程_buffer_18this.label3 = new System.Windows.Forms.Label(); 

C# socket编程_buffer_18this.label4 = new System.Windows.Forms.Label(); 

C# socket编程_buffer_18this.SuspendLayout(); 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// rtbReceive 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.rtbReceive.Location = new System.Drawing.Point(80, 56); 

C# socket编程_buffer_18this.rtbReceive.Name = "rtbReceive"; 

C# socket编程_buffer_18this.rtbReceive.Size = new System.Drawing.Size(264, 96); 

C# socket编程_buffer_18this.rtbReceive.TabIndex = 0; 

C# socket编程_buffer_18this.rtbReceive.Text = ""; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// rtbSend 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.rtbSend.Location = new System.Drawing.Point(80, 152); 

C# socket编程_buffer_18this.rtbSend.Name = "rtbSend"; 

C# socket编程_buffer_18this.rtbSend.Size = new System.Drawing.Size(264, 96); 

C# socket编程_buffer_18this.rtbSend.TabIndex = 1; 

C# socket编程_buffer_18this.rtbSend.Text = ""; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// txtServer 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.txtServer.Location = new System.Drawing.Point(72, 16); 

C# socket编程_buffer_18this.txtServer.Name = "txtServer"; 

C# socket编程_buffer_18this.txtServer.TabIndex = 2; 

C# socket编程_buffer_18this.txtServer.Text = "127.0.0.1"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// txtPort 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.txtPort.Location = new System.Drawing.Point(288, 16); 

C# socket编程_buffer_18this.txtPort.Name = "txtPort"; 

C# socket编程_buffer_18this.txtPort.Size = new System.Drawing.Size(48, 21); 

C# socket编程_buffer_18this.txtPort.TabIndex = 3; 

C# socket编程_buffer_18this.txtPort.Text = "19811"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// statusBar1 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.statusBar1.Location = new System.Drawing.Point(0, 287); 

C# socket编程_buffer_18this.statusBar1.Name = "statusBar1"; 

C# socket编程_buffer_18this.statusBar1.ShowPanels = true; 

C# socket编程_buffer_18this.statusBar1.Size = new System.Drawing.Size(360, 22); 

C# socket编程_buffer_18this.statusBar1.TabIndex = 4; 

C# socket编程_buffer_18this.statusBar1.Text = "statusBar1"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// btnListen 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.btnListen.Location = new System.Drawing.Point(32, 256); 

C# socket编程_buffer_18this.btnListen.Name = "btnListen"; 

C# socket编程_buffer_18this.btnListen.TabIndex = 5; 

C# socket编程_buffer_18this.btnListen.Text = "开始监听"; 

C# socket编程_buffer_18this.btnListen.Click += new System.EventHandler(this.btnListen_Click); 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// btnSend 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.btnSend.Location = new System.Drawing.Point(144, 256); 

C# socket编程_buffer_18this.btnSend.Name = "btnSend"; 

C# socket编程_buffer_18this.btnSend.TabIndex = 6; 

C# socket编程_buffer_18this.btnSend.Text = "发送信息"; 

C# socket编程_buffer_18this.btnSend.Click += new System.EventHandler(this.btnSend_Click); 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// btnStop 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.btnStop.Location = new System.Drawing.Point(256, 256); 

C# socket编程_buffer_18this.btnStop.Name = "btnStop"; 

C# socket编程_buffer_18this.btnStop.TabIndex = 7; 

C# socket编程_buffer_18this.btnStop.Text = "停止监听"; 

C# socket编程_buffer_18this.btnStop.Click += new System.EventHandler(this.btnStop_Click); 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// label1 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.label1.Location = new System.Drawing.Point(16, 16); 

C# socket编程_buffer_18this.label1.Name = "label1"; 

C# socket编程_buffer_18this.label1.Size = new System.Drawing.Size(56, 23); 

C# socket编程_buffer_18this.label1.TabIndex = 8; 

C# socket编程_buffer_18this.label1.Text = "服务器:"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// label2 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.label2.Location = new System.Drawing.Point(216, 16); 

C# socket编程_buffer_18this.label2.Name = "label2"; 

C# socket编程_buffer_18this.label2.Size = new System.Drawing.Size(64, 23); 

C# socket编程_buffer_18this.label2.TabIndex = 9; 

C# socket编程_buffer_18this.label2.Text = "监听端口:"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// label3 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.label3.Location = new System.Drawing.Point(16, 64); 

C# socket编程_buffer_18this.label3.Name = "label3"; 

C# socket编程_buffer_18this.label3.Size = new System.Drawing.Size(64, 23); 

C# socket编程_buffer_18this.label3.TabIndex = 10; 

C# socket编程_buffer_18this.label3.Text = "接收信息:"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// label4 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.label4.Location = new System.Drawing.Point(16, 152); 

C# socket编程_buffer_18this.label4.Name = "label4"; 

C# socket编程_buffer_18this.label4.Size = new System.Drawing.Size(64, 23); 

C# socket编程_buffer_18this.label4.TabIndex = 11; 

C# socket编程_buffer_18this.label4.Text = "发送信息:"; 

C# socket编程_buffer_18// 

C# socket编程_buffer_18// Form1 

C# socket编程_buffer_18// 

C# socket编程_buffer_18this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); 

C# socket编程_buffer_18this.ClientSize = new System.Drawing.Size(360, 309); 

C# socket编程_buffer_18this.Controls.Add(this.label4); 

C# socket编程_buffer_18this.Controls.Add(this.label3); 

C# socket编程_buffer_18this.Controls.Add(this.label2); 

C# socket编程_buffer_18this.Controls.Add(this.label1); 

C# socket编程_buffer_18this.Controls.Add(this.btnStop); 

C# socket编程_buffer_18this.Controls.Add(this.btnSend); 

C# socket编程_buffer_18this.Controls.Add(this.btnListen); 

C# socket编程_buffer_18this.Controls.Add(this.statusBar1); 

C# socket编程_buffer_18this.Controls.Add(this.txtPort); 

C# socket编程_buffer_18this.Controls.Add(this.txtServer); 

C# socket编程_buffer_18this.Controls.Add(this.rtbSend); 

C# socket编程_buffer_18this.Controls.Add(this.rtbReceive); 

C# socket编程_buffer_18this.Name = "Form1"; 

C# socket编程_buffer_18this.Text = "聊天程序-服务器"; 

C# socket编程_buffer_18this.TopMost = true; 

C# socket编程_buffer_18this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); 

C# socket编程_buffer_18this.ResumeLayout(false); 

C# socket编程_buffer_18

C# socket编程_socket_19

C# socket编程_socket_19#endregion 

C# socket编程_buffer_18

C# socket编程_buffer_16C# socket编程_服务器_17/**//// <summary> 

C# socket编程_buffer_18/// 应用程序的主入口点。 

C# socket编程_socket_19/// </summary> 

C# socket编程_buffer_18[STAThread] 

C# socket编程_buffer_18static void Main() 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18Application.Run(new Form1()); 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_18private void btnListen_Click(object sender, System.EventArgs e) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18hostIPAddress=IPAddress.Parse(txtServer.Text); 

C# socket编程_buffer_18port=txtPort.Text; 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch...{MessageBox.Show("请输入正确的IP地址格式");} 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ //通过组合服务的主机 IP 地址和端口号,IPEndPoint 类形成到服务的连接点。 

C# socket编程_buffer_18Server=new IPEndPoint(hostIPAddress,Int32.Parse(port)); 

C# socket编程_buffer_18// Create a socket object to establish a connection with the server 

C# socket编程_buffer_18listeningSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 

C# socket编程_buffer_18listeningSocket.Bind(Server); //绑定该主机端口 

C# socket编程_buffer_18listeningSocket.Listen(50); //监听端口,等待客户端连接请求。50是队列中最多可容纳的等待接受的传入连接数 

C# socket编程_buffer_18statusBar1.Text="主机"+txtServer.Text+"端口"+txtPort.Text+"开始监听....."; 

C# socket编程_buffer_18//Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。 

C# socket编程_buffer_18//mySocket=listeningSocket.Accept(); 

C# socket编程_buffer_18//一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托指定由线程执行的程序代码。 

C# socket编程_buffer_18Thread thread=new Thread(new ThreadStart(ThreadProc)); 

C# socket编程_buffer_18thread.Start(); 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch(Exception ee)...{statusBar1.Text=ee.Message;} 

C# socket编程_socket_19

C# socket编程_buffer_18private void ThreadProc() 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18//if(mySocket.Connected) 

C# socket编程_buffer_18//{ 

C# socket编程_buffer_18//statusBar1.Text="与客户建立连接."; 

C# socket编程_buffer_18while(true) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_16C# socket编程_服务器_17/**//*Byte[] ByteRecv=new Byte[256]; 

C# socket编程_buffer_18mySocket.Receive(ByteRecv,ByteRecv.Length,0); 

C# socket编程_buffer_18string strRecv=Encoding.BigEndianUnicode.GetString(ByteRecv); 

C# socket编程_socket_19rtbReceive.AppendText(strRecv+" ");*/ 

C# socket编程_buffer_18Done.Reset(); //将状态设为非终止 

C# socket编程_buffer_18listeningSocket.BeginAccept(new AsyncCallback(AcceptCallBack),listeningSocket);//开始一个异步操作来接受一个传入的连接尝试 

C# socket编程_buffer_18Done.WaitOne(); //阻塞当前线程,直到当前线程收到信号。 

C# socket编程_socket_19

C# socket编程_buffer_18//} 

C# socket编程_socket_19

C# socket编程_buffer_18private void AcceptCallBack(IAsyncResult ar)//ar表示异步操作的状态。 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18Done.Set();//设为终止 

C# socket编程_buffer_18mySocket=(Socket)ar.AsyncState; //获取状态 

C# socket编程_buffer_18handler=mySocket.EndAccept(ar); //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信,获取结果 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18byte[] byteData=Encoding.BigEndianUnicode.GetBytes("准备完毕,可以通话"+" "); 

C# socket编程_buffer_18//调用SendCallBack异步发送数据, 

C# socket编程_buffer_18handler.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallBack),handler); 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch(Exception ee)...{MessageBox.Show(ee.Message);} 

C# socket编程_buffer_18Thread thread=new Thread(new ThreadStart(ThreadRev)); 

C# socket编程_buffer_18thread.Start(); 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_18private void SendCallBack(IAsyncResult ar) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18handler=(Socket)ar.AsyncState; //获取状态 

C# socket编程_buffer_18int bytesSent=handler.EndSend(ar);//结束挂起的异步发送,返回向 Socket 发送的字节数 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch...{} 

C# socket编程_socket_19

C# socket编程_buffer_18private void ThreadRev() 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18handler.BeginReceive(buffer,0,BufferSize,0,new AsyncCallback(ReadCallBack),handler); 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_18private void ReadCallBack(IAsyncResult ar) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18int bytesRead=handler.EndReceive(ar); //结束挂起的异步读取,返回接收到的字节数。 

C# socket编程_buffer_18StringBuilder sb=new StringBuilder(); //接收数据的可变字符字符串,在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。 

C# socket编程_buffer_18sb.Append(Encoding.BigEndianUnicode.GetString(buffer,0,bytesRead));//追加字符串 

C# socket编程_buffer_18string content=sb.ToString(); //转换为字符串 

C# socket编程_buffer_18sb.Remove(0,content.Length); //清除sb内容 

C# socket编程_buffer_18rtbReceive.AppendText(content+" "); 

C# socket编程_buffer_18handler.BeginReceive(buffer,0,BufferSize,0,new AsyncCallback(ReadCallBack),handler); 

C# socket编程_socket_19

C# socket编程_buffer_18private void btnStop_Click(object sender, System.EventArgs e) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18listeningSocket.Close(); 

C# socket编程_buffer_18statusBar1.Text="主机"+txtServer.Text+"端口"+txtPort.Text+"监听停止"; 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch...{MessageBox.Show("监听尚未开始,关闭无效");} 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_18private void btnSend_Click(object sender, System.EventArgs e) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18string strSend ="Server--->"+rtbSend.Text+" "; 

C# socket编程_buffer_18Byte[] ByteSend = Encoding.BigEndianUnicode.GetBytes(strSend); 

C# socket编程_buffer_18handler.BeginSend(ByteSend,0,ByteSend.Length,0,new AsyncCallback(SendCallBack),handler); 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch...{MessageBox.Show("连接尚未建立,无法发送.");} 

C# socket编程_socket_19

C# socket编程_buffer_18

C# socket编程_buffer_18private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18try 

C# socket编程_buffer_16C# socket编程_服务器_17...{ 

C# socket编程_buffer_18listeningSocket.Close();//在窗口关闭之前关闭Scoket连接并释放所有关联的资源。 

C# socket编程_socket_19

C# socket编程_buffer_16C# socket编程_服务器_17catch...{} 

C# socket编程_socket_19

C# socket编程_socket_19

C# socket编程_socket_374}


C# socket编程_buffer

C# socket编程_buffer