快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

改善C#中socket通信机客户端程序的健壮性

    我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,假如server存在,并且答应连接的话,程序无错,正常执行;但是假如Server不存在,或者拒绝连接,程序就会卡住,此时不提示出错。开始我以为是没有Catch非常,但是检查了程序,非常情况都Catch掉了,程序还是卡。

请各位大虾帮忙指正!谢谢,以下是我这个模块的代码!

using System;
using System.Collections;
using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;


namespace 测试程序
{
 /// <summary>
 /// ClassClient 的摘要说明。
 /// </summary>
 public class ClassClient
 {
  //方式
  public ClassClient()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  //函数

  #region socket通信机连接函数
  /// <summary>
  /// socket通信机连接函数
  /// </summary>
  /// <param name=\"remoteEP\">远程终端</param>
  /// <param name=\"client\">建立客户端</param>
  public  byte SocketConnect(EndPoint RemoteEP, Socket Client)
  {
   //调用系统连接函数
   Client.BeginConnect(RemoteEP,new AsyncCallback(ConnectCallback), Client );
           
   ConnectDone.WaitOne();
   
   return(1);

   
  }
  #endregion

  #region socket连接返回函数
  /// <summary>
  /// socket连接返回函数
  /// </summary>
  /// <param name=\"ar\">表示异步操作的状态</param>
  private static void ConnectCallback(IAsyncResult ar)
  {
   try
   {
    // 获取socket连接实例
    Socket client = (Socket) ar.AsyncState;

    // 完成连接过程.
    client.EndConnect(ar);

    // 置位连接完成标志
    ConnectDone.Set();
    
    // 得到连接成功信息
    ConnectInfo=\"连接成功!\";
   }
   catch (Exception e)
   {
    // 得到连接失败信息
    ConnectInfo=e.ToString ();

    // 结束连接
    ConnectDone.Reset ();
   }
  }
  #endregion

  #region socket通信机关闭函数
  /// <summary>
  /// socket通信机关闭函数
  /// </summary>
  /// <param name=\"Client\">需关闭的socket通信实例</param>
  public byte SocketClose(Socket Client)
  {
   try
   {
    if (Client!=null)
    {
     //假如仍旧产生通信信息,则禁用
     if (Client.Connected) 
     {
      Client.Shutdown(SocketShutdown.Both);
     }
     //关闭socket通信
     Client.Close();

     //获得关闭成功信息
     CloseInfo = \"通信机已关闭!\";
    }
    return(1);
   }
   catch (Exception e)
   {
    //获得关闭通信失败信息
    CloseInfo = e.ToString();

    return(0);
   }
  }
  #endregion

  #region 数据发送函数
  /// <summary>
  /// 数据发送函数
  /// </summary>
  /// <param name=\"Client\">已连接的socket通信机实例(客户端)</param>
  /// <param name=\"MessageSend\">需发送的信息</param>
  /// <returns>
  /// 返回发送是否成功值
  /// </returns>
  public bool SocketSend(Socket Client, String MessageSend)
  {
   //将数据转变成Byte型ASCII码。
   byte[] ByteData = Encoding.ASCII.GetBytes(MessageSend);

   // 向远程设备(Server)发送数据.
   Client.BeginSend(ByteData, 0, ByteData.Length, SocketFlags.None,new AsyncCallback(SendCallback), Client);
           
   //发送标志事件等待
   SendDone.WaitOne();
           
   //返回真
   return(true);
  }
  #endregion

本新闻共2页,当前在第1页  1  2  

本新闻共2页,当前在第1页  1  2  


返回类别: 教程
上一教程: 如何使用asp+ 动态创建页面元素
下一教程: 使用COBOL.net访问数据库

您可以阅读与"改善C#中socket通信机客户端程序的健壮性"相关的教程:
· .NET客户端应用程序:.NET应用程序更新组件(6)
· .NET客户端应用程序:.NET应用程序更新组件(5)
· 检测客户端显示器分辨率、浏览器类型和客户端IP
· 用VS.NET2003制作WEB应用程序的安装包
· 一个FTP客户端的C#代码
    微笑服务 优质保证 索取样品