日期:2014-05-18  浏览次数:20798 次

qq企业通
在qq企业通中,qq聊天中,如果开启两个窗口就会提示“通常每个套接字地址(协议/网络地址/端口)只允许使用一次。”我也是用C#做的。可能是要多线程才行,我的是单线程而已,如果要多线程,应该怎么写,拜托各位高手帮帮忙了。下面是我创建udp套接口的代码:
 public partial class UDPSocket : Component
  {
  private IPEndPoint ServerEndPoint = null; //定义网络端点
  private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Socket
  private System.Threading.Thread thdUdp; //创建一个线程
  public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port); //定义了一个托管方法
  public event DataArrivalEventHandler DataArrival; //通过托管理在控件中定义一个事件
  private string localHost = "192.168.137.15";
  [Browsable(true), Category("Local"), Description("本地IP地址")] //在“属性”窗口中显示localHost属性
  public string LocalHost
  {
  get { return localHost; }
  set { localHost = value; }
  }

  private int localPort = 11000;
  [Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
  public int LocalPort
  {
  get { return localPort; }
  set { localPort = value; }
  }

  private bool active = false;
  [Browsable(true), Category("Local"), Description("激活监听")] //在“属性”窗口中显示active属性
  public bool Active
  {
  get { return active; }  
  set //该属性读取值
  { 
  active = value;
  if (active) //当值为True时
  {
  OpenSocket(); //打开监听
  }
  else
  {
  CloseSocket(); //关闭监听
  }
  }
  }
  public UDPSocket()
  {
  InitializeComponent();
  }
  public UDPSocket(IContainer container)
  {
  container.Add(this);

  InitializeComponent();
  }
  protected void Listener() //监听
  {
  ServerEndPoint = new IPEndPoint(IPAddress.Any,localPort); //将IP地址和端口号以网络端点存储
  if (UDP_Server != null)
  UDP_Server.Close();
  UDP_Server = new UdpClient(localPort); //创建一个新的端口号
  UDP_Server.Client.ReceiveBufferSize = 1000000000; //接收缓冲区大小
  UDP_Server.Client.SendBufferSize = 1000000000; //发送缓冲区大小
   
  try
  {
  thdUdp = new Thread(new ThreadStart(GetUDPData)); //创建一个线程
  thdUdp.Start(); //执行当前线程
  }
  catch (Exception e)
  {
  MessageBox.Show(e.ToString()); //显示线程的错误信息
  }
  }

  private void GetUDPData() //获取当前接收的消息
  {
  while (active)
  {
  try
  {
  byte[] Data = UDP_Server.Receive(ref ServerEndPoint); //将获取的远程消息转换成二进制流
  if (DataArrival != null) //如果当前正在托管
  {
  DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);//利用当前控件的DataArrival事件将消息发给远程计算机
  }