Exemple #1
0
 public fMain()
 {
     InitializeComponent();
     InitializeEventHandlers();
     ExtraInit();
     CheckForIllegalCrossThreadCalls = false;
     KGState = KeiGuiState.Initialized;
 }
Exemple #2
0
        void cmdStartServers_Click(object sender, EventArgs e)
        {
            if (_kClient == null || _kTracker == null)
            {
                if (CheckServerFields())
                {
                    IPAddress ipa;
                    _wasStartedAsPI = KeiGuiOptions.Current.IsPointInsertion;
                    if (KeiGuiOptions.Current.IsPointInsertion || (false && KeiGuiOptions.Current.UsePortMapping))
                    {
                        // 作为接入点或者启用了 UPnP 的普通用户启动
                        ipa = IPAddress.Parse(cboPossibleAddresses.Text.Split(' ')[0]);
                    }
                    else
                    {
                        // 作为普通用户启动
                        ipa = IPAddress.Loopback;
                    }
                    var nTracker        = Convert.ToInt32(txtLocalTrackerServerPort.Text);
                    var nKClient        = Convert.ToInt32(txtLocalKClientPort.Text);
                    var trackerEndPoint = new IPEndPoint(ipa, nTracker);
                    var kcEndPoint      = new IPEndPoint(ipa, nKClient);

                    if (_kTracker == null)
                    {
                        _kTracker = new TrackerServer(trackerEndPoint);
                    }
                    if (_kClient == null)
                    {
                        _kClient = new KClient(_kTracker, kcEndPoint);
                        _kClient.ConnectionListChanged += _kClient_ConnectionListChanged;
                    }

                    //if (!_kTracker.IsBound)
                    //{
                    //    if (!_kTracker.TestBind(trackerEndPoint))
                    //    {
                    //        MessageBox.Show("Tracker 服务器端口不可用,请设置一个新的端口。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    //        _kTracker = null;
                    //        return;
                    //    }
                    //}
                    //txtLocalTrackerServerPort.Enabled = false;
                    //if (!_kClient.IsBound)
                    //{
                    //    if (!_kClient.TestBind(kcEndPoint))
                    //    {
                    //        MessageBox.Show("K客户端服务器端口不可用,请设置一个新的端口。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    //        _kClient = null;
                    //        return;
                    //    }
                    //}
                    //txtLocalKClientPort.Enabled = false;

                    if (KeiGuiOptions.Current.EnableLogging)
                    {
                        _kTracker.Logger = Program.Logger;
                        _kClient.Logger  = Program.Logger;
                    }

                    if (KeiGuiOptions.Current.IsPointInsertion)
                    {
                        _kClient.FreeToGo  = true;
                        _kTracker.FreeToGo = true;
                    }

                    _kTracker.Listen();
                    if (KeiGuiOptions.Current.IsPointInsertion)
                    {
                        // 接入点立即启动,普通用户要连接到接入点后才能启动
                        _kClient.Listen();
                    }

                    groupBox1.Enabled = false;
                    groupBox2.Enabled = true;

                    txtLocalKClientEndPoint.Text = _kClient.LocalKEndPoint.ToString();
                    txtLocalTrackerAddress.Text  = "http://localhost:" + _kTracker.LocalEndPoint.Port.ToString() + _kTracker.AnnouceUrl.TrimEnd('?');

                    SetStatusText("服务器已启动");
                    KGState = KeiGuiState.ServersStarted;
                }
            }
        }
Exemple #3
0
 void cmdConnectToTargetKClient_Click(object sender, EventArgs e)
 {
     try
     {
         IPEndPoint ipep = KeiUtil.ParseIPEndPoint(cboTargetKClientEndPoint.Text);
         Thread     kcWorkerThread;
         for (var i = 0; i < 1; i++)
         {
             //Thread.Sleep(1500);
             WaitHandle wh;
             if (KeiGuiOptions.Current.IsPointInsertion)
             {
                 wh = _kClient.EnterNetwork(ipep, Convert.ToUInt16(txtLocalKClientPort.Text), out kcWorkerThread);
             }
             else
             {
                 // 普通用户
                 wh = _kClient.EnterNetwork(ipep, 0, out kcWorkerThread);
             }
             Thread thread = new Thread(delegate()
             {
                 Invoke(new Action(() =>
                 {
                     cmdConnectToTargetKClient.Enabled = false;
                 }));
                 TimeSpan passedTime = TimeSpan.Zero;
                 while (kcWorkerThread.IsAlive && !wh.SafeWaitHandle.IsClosed && passedTime < TimeSpan.FromSeconds(3))
                 {
                     wh.WaitOne(TimeSpan.FromMilliseconds(10));
                     passedTime += TimeSpan.FromMilliseconds(10);
                 }
                 if (_kClient.ConnectionList.Count > 0)
                 {
                     Invoke(new Action(() =>
                     {
                         if (!_kClient.IsActive)
                         {
                             // 普通用户此时启动
                             // 不过确实,想想,对于普通用户,如果是端口在从 TestBind() 到现在(即,点下“启动”按钮到点下“连接”按钮并成功)
                             // 这段时间内,该K客户端端口被占用了怎么办?这里就会直接异常,线程崩溃了……
                             _kClient.Listen();
                         }
                         cmdConnectToTargetKClient.Enabled = false;
                         groupBox2.Enabled = false;
                         KGState           = KeiGuiState.Connected;
                         if (!cboTargetKClientEndPoint.Items.Contains(cboTargetKClientEndPoint.Text))
                         {
                             cboTargetKClientEndPoint.Items.Add(cboTargetKClientEndPoint.Text);
                         }
                         SetStatusText("已经连接到 " + cboTargetKClientEndPoint.Text + ",开始工作 [" + _kClient.ConnectionList.Count.ToString() + "]");
                         mnuOpForceBroadcast.Enabled = true;
                         ctxForceBroadcast.Enabled   = true;
                     }));
                 }
                 else
                 {
                     Invoke(new Action(() =>
                     {
                         cmdConnectToTargetKClient.Enabled = true;
                         SetStatusText("未能连接到 " + cboTargetKClientEndPoint.Text);
                     }));
                 }
             });
             thread.IsBackground = true;
             thread.Start();
         }
     }
     catch (Exception ex)
     {
         Program.Logger.Log(ex.Message);
     }
 }