异步通信实例(一)Server

 
using  System;
using  System.Drawing;
using  System.Collections;
using  System.ComponentModel;
using  System.Windows.Forms;
using  System.Data;
using  System.Text;
using  System.Net;
using  System.Net.Sockets;
using  System.Threading;

namespace  TServer
{
    
/// <summary>
    
/// Form1 的摘要说明。
    
/// </summary>

    public class Form1 : System.Windows.Forms.Form
    
{
        
private System.Windows.Forms.TextBox txt;
        
private System.Net.Sockets.Socket server;
        
private System.Windows.Forms.ComboBox cmbIP;
        
private System.Windows.Forms.Button btnStart;
        
private System.Windows.Forms.Button btnStop;
        
private System.Windows.Forms.StatusBar statBar;
        
private System.Threading.ManualResetEvent allDone;
        
private byte[] buffer;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
public Form1()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();

            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if (components != null
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }


        
Windows 窗体设计器生成的代码

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main() 
        
{
            Application.Run(
new Form1());
        }


        
private void Form1_Load(object sender, System.EventArgs e)
        
{
            
this.server = new Socket( AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp );
            
this.allDone = new ManualResetEvent( true );
            
this.cmbIP.Items.Clear();
            
foreach( IPAddress ip in Dns.GetHostByName( Dns.GetHostName() ).AddressList )
            
{
                
this.cmbIP.Items.Add( ip.ToString() );
            }

            
ifthis.cmbIP.Items.Count > 0 )
                
this.cmbIP.SelectedIndex = 0;
            
this.statBar.Text = "初始化完成...";
            
this.btnStop.Enabled = false;
            
this.buffer = new byte1024];
        }


        
private void btnStart_Click(object sender, System.EventArgs e)
        
{
            
try
            
{
                IPEndPoint ipep 
= new IPEndPoint( IPAddress.Parse( this.cmbIP.Text ),9000 );
                
this.server.Bind( (EndPoint)ipep );
                
this.server.Listen( 10 );
                
this.server.BeginAccept( new AsyncCallback( this.AcceptCallback ),this.server );
                
this.statBar.Text = "服务器" + ipep.ToString() + "正在监听...";
                
this.txt.Text = "开始等待客户端连接...";
            }

            
catch( Exception ex )
            
{
                
this.txt.Text += " " + ex.ToString();
            }

        }


        
private void AcceptCallback( System.IAsyncResult iar )
        
{
            
if( iar.IsCompleted )
            
{
                
try
                
{
                    Socket oldServer 
= (Socket)iar.AsyncState;
                    Socket client 
= (Socket)oldServer.EndAccept( iar );                    
                    
this.txt.Text += " 远程客户端:" + client.RemoteEndPoint.ToString() + "连接...";
                    
byte[] send = System.Text.Encoding.Default.GetBytes( "服务器端的响应 at " + DateTime.Now.ToString() );    
                    client.BeginSend( send,
0,send.Length,SocketFlags.None,new AsyncCallback(this.SendCallback ),client );
                }

                
catch( Exception ex )
                
{
                    
this.txt.Text += " " + ex.ToString();
                }

            }

        }


        
private void SendCallback( System.IAsyncResult iar )
        
{
            
try
            
{
                Socket socket 
= (Socket)iar.AsyncState;
                
int send = socket.EndSend( iar );
                
this.txt.Text += " 已发送至客户端数据,大小为:" + send.ToString();
                socket.BeginReceive(
this.buffer,0,this.buffer.Length,SocketFlags.None,new AsyncCallback(this.ReceiveCallback),socket );
            }

            
catch( Exception ex )
            
{
                
this.txt.Text += " " + ex.ToString();
            }

        }


        
private void StartReceive()
        
{
//            this.allDone.Reset();
//            this.server.BeginReceive( this.buffer,0,this.buffer.Length,SocketFlags.None,new AsyncCallback(this.ReceiveCallback ),this.server );
//            this.allDone.WaitOne();
        }


        
private void ReceiveCallback( System.IAsyncResult iar )
        
{
            
try
            
{
                
                Socket client 
= (Socket)iar.AsyncState;
                
int recv = client.EndReceive( iar );
                
if( recv == 0 )
                
{
                    client.Close();
                    
this.txt.Text += " 等待客户端连接..:";
                    
this.server.BeginAccept( new AsyncCallback(this.AcceptCallback),this.server );
                    
return;
                }

                
string msg = System.Text.Encoding.Default.GetString( this.buffer,0,recv );
                
this.txt.Text += "" + client.RemoteEndPoint.ToString() + "接收到的数据是:" + msg;
                
byte[] re = System.Text.Encoding.Default.GetBytes( "服务器端已收到:" + msg );
                client.BeginSend( re,
0,re.Length,SocketFlags.None,new AsyncCallback(this.SendCallback ),client );
            }

            
catch( Exception ex )
            
{
                
this.txt.Text += " " + ex.ToString();
            }

        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值