2015-12-07 2 views
0

Я пытаюсь загрузить две веб-страницы с помощью моего проекта winfe cefSharp. Первая страница будет отображаться, потому что это локальная страница html. Вторая страница должна выполнить ping, потому что это веб-сайт сервера. Мне нужно проверить, можно ли сначала подключать IP-адрес и порт сервера, только я перенаправляюсь на эту страницу. Ниже мое кодирование:Попытка улучшить мой ответ Ping TCP-порта

public Form1() 
    { 
     Console.WriteLine("-------Initialization------"); 
     InitializeComponent(); 

     this.StartPosition = FormStartPosition.Manual; 
     this.Location = new Point(0, 0); 

     BrowserSettings browserSettings = new BrowserSettings(); 
     Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory + "html\\index.html"); 
     browser = new CefSharp.WinForms.ChromiumWebBrowser(AppDomain.CurrentDomain.BaseDirectory + "html\\index.html") 
     {// First page. 
      Dock = DockStyle.Fill, 
     }; 
     this.Controls.Add(browser); 
     browser.BrowserSettings.WebSecurity = CefState.Disabled; 
     browser.BrowserSettings.FileAccessFromFileUrls = CefState.Enabled; 
     browser.BrowserSettings.UniversalAccessFromFileUrls = CefState.Enabled; 

     while (true) 
     { 
      pSvr = PingServer(ioIP, int.Parse(ioPort)); 
      if (pSvr == true) 
      { 
       label3.Text = "Connected to server. Please wait..."; 
       tmr.Interval = 15000; 
       tmr.Tick += timerHandler; 
       tmr.Start(); 
       break; 
      } 
      Thread.Sleep(5000); 
     } 
    } 

    public bool PingServer(string _HostIP, int _PortNumber) 
    { 
     try 
     { 
      TcpClient client = new TcpClient(_HostIP, _PortNumber); 
      Console.WriteLine("Server successfully connected..."); 
      return true; 
     } 
     catch 
     { 
      Console.WriteLine("Error pinging server..."); 
      return false; 
     } 
    } 

    private void timerHandler(object sender, EventArgs e) 
    { 
     tmr.Stop(); 
      browser.Load("http://" + ioIP + ":" + ioPort + "/page2/?1"); // second page 
    } 

Я использую время цикл и сделать Thread.sleep в течение 5 секунд, чтобы сохранить повторные попытки подключения к серверу, если это не удалось.

Логически говоря, независимо от того, могу ли я подключиться ко второй странице, сначала хочу, чтобы первая страница отображалась первой, и она будет повторять попытку подключения ко второй странице в фоновом режиме. Но когда я запускаю свой код и когда он не может подключиться к серверу, первая страница не выйдет. Похоже, что он переходит в цикл while и продолжает повторную попытку подключиться ко второй странице и забыть о показе первой страницы. Это проблема с циклом while? Всегда показывает «Error pinging server ...», предотвращающий отображение первой страницы? И что вы, ребята, думаете, что это самый подходящий способ для меня повторить подключение к серверу?

ответ

0

Что вы, ребята, думаете, что это самый подходящий способ для повторного подключения к серверу?

ИМХО, вы не должны беспокоиться о «пинге». Все, что действительно имеет значение, - можно ли загрузить страницу. Сервер, который полностью недоступен, является лишь одной из многих возможных причин, по которым он может потерпеть неудачу, и даже если вы успешно «ping» на сервере, вы все равно можете потерять соединение после «ping», но перед загрузкой страницы или сбоем другая причина.

Не беспокойтесь, пытаясь обнаружить сервер. Просто загрузите страницу и обработайте исключения, если они возникнут.


Что касается большей проблемы, первой страницы не отображается, это связано с тем, что вы слишком много работаете в конструкторе. Конструктор выполняется в потоке пользовательского интерфейса, который является потоком, который отвечает за все обновления визуального внешнего вида вашей программы. Пока вы не вернетесь от конструктора, эта нить не сможет ничего сделать. Поэтому, даже несмотря на то, что вы загрузили страницу, элемент управления не может отразить это на экране; ваш конструктор связывает поток.

Основным решением является «do not do that». Существует множество способов избежать этого, но в этом случае я чувствую, что, поскольку вы не должны «пинговать» сервер в первую очередь, вы можете решить свою проблему, просто избавившись от этого:

public Form1() 
{ 
    Console.WriteLine("-------Initialization------"); 
    InitializeComponent(); 

    this.StartPosition = FormStartPosition.Manual; 
    this.Location = new Point(0, 0); 

    BrowserSettings browserSettings = new BrowserSettings(); 
    Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory + "html\\index.html"); 
    browser = new CefSharp.WinForms.ChromiumWebBrowser(AppDomain.CurrentDomain.BaseDirectory + "html\\index.html") 
    {// First page. 
     Dock = DockStyle.Fill, 
    }; 
    this.Controls.Add(browser); 
    browser.BrowserSettings.WebSecurity = CefState.Disabled; 
    browser.BrowserSettings.FileAccessFromFileUrls = CefState.Enabled; 
    browser.BrowserSettings.UniversalAccessFromFileUrls = CefState.Enabled; 

    tmr.Interval = 15000; 
    tmr.Tick += timerHandler; 
    tmr.Start(); 
} 

То, что сразу загрузит первую страницу, подождите 15 секунд, а затем попробуйте, чтобы загрузить вторую страницу. Если сервер там, он покажет. Если нет, вы получите необработанное исключение; лучше разместить там и представить пользователю некоторую полезную информацию и параметры (например, «не удалось подключиться, повторить?»).


Если вы чувствуете, что действительно должны отображать сообщение "Connected to server. Please wait...", то есть выполнять пинг, то вы должны сделать это асинхронно. Например:

protected override async void OnLoad(EventArgs e) 
{ 
    while (true) 
    { 
     pSvr = await PingServer(ioIP, int.Parse(ioPort)); 
     if (pSvr == true) 
     { 
      label3.Text = "Connected to server. Please wait..."; 
      tmr.Interval = 15000; 
      tmr.Tick += timerHandler; 
      tmr.Start(); 
      break; 
     } 
     await Task.Delay(5000); 
    } 
} 

async Task<bool> PingServer(string _HostIP, int _PortNumber) 
{ 
    try 
    { 
     TcpClient client = new TcpClient(); 
     await client.ConnectAsync(_HostIP, _PortNumber); 
     Console.WriteLine("Server successfully connected..."); 
     return true; 
    } 
    catch 
    { 
     Console.WriteLine("Error pinging server..."); 
     return false; 
    } 
} 

Вышеупомянутое полностью заменит цикл в вашем конструкторе (включая запуск таймера ...обратите внимание, что вторая страница будет загружаться не через 15 секунд после загрузки первой страницы, а через 15 секунд после успешного обнаружения сервера).

Смежные вопросы