2015-08-11 4 views
0

Так что я делаю бота, который подключается к часту. Вот код:Пока истинный цикл не бесконечен?

Console.WriteLine("Joining Room"); 
IrcClient irc = new IrcClient("irc.twitch.tv", 6667, "ScottBots", "oauth:asdasd"); 

irc.joinRoom("ScottBots"); 
Console.WriteLine("Joined Room"); 

int i = 0; 

while (true) 
{ 
    string message = irc.readMessage(); 
    if(message.Contains("!helps")) 
    { 
     irc.sendChatMessage("Welcome to ScottBots! Currently in development."); 
    } 
    Console.WriteLine("loop: " + i); 
    i++; 
} 

Посмотрите, какова бы ни была настоящая петля ... Все в порядке?

Теперь посмотрим на то, что это консольное приложение дает мне:

Joining Room 
Joined Room 
loop: 0 
loop: 1 
loop: 2 
loop: 3 
loop: 4 
loop: 5 
loop: 6 
loop: 7 
loop: 8 
loop: 9 

Он просто останавливается на 9?

Многие ya'll спрашивали моего ircClient Код:

private string username; 
    private string channel; 

    private TcpClient tcpClient; 
    private StreamReader inputStream; 
    private StreamWriter outputSteam; 

    public IrcClient(string ip, int port, string username, string password) 
    { 
     this.username = username; 

     tcpClient = new TcpClient(ip, port); 
     inputStream = new StreamReader(tcpClient.GetStream()); 
     outputSteam = new StreamWriter(tcpClient.GetStream()); 
     try 
     { 
      outputSteam.WriteLine("PASS " + password); 
      outputSteam.WriteLine("NICK " + username); 
      outputSteam.WriteLine("USER " + username + " 8 * :" + username); 
      outputSteam.Flush(); 
     } catch (Exception e) 
     { 

     } 

    } 

    public void joinRoom(string channel) 
    { 
     try 
     { 
      this.channel = channel; 
      outputSteam.WriteLine("JOIN #" + channel); 
      outputSteam.Flush(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Failed to join room"); 
     } 

    } 

    public void sendIrcMessage(string message) 
    { 


     try 
     { 
      outputSteam.WriteLine(message); 
      outputSteam.Flush(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("failed to run sendIrcMessage() method"); 
     } 
    } 

    public void sendChatMessage(string message) 
    { 
     sendIrcMessage(":" + username + "!" + username + "@" + username + ".tmi.twitch.tv PRIVNSG #" + channel + " : " + message); 
    } 

    public string readMessage() 
    { 
     string message = inputStream.ReadLine(); 
     return message; 
    } 
+4

Скорее всего, один из ваших методов 'irc.XXX' выходит из строя и генерирует исключение в вашем цикле. – Eser

+0

Должен ли я просто попытаться поймать все? @Eser –

+1

'string message = irc.readMessage();' это ждет сообщения, например 'Console.ReadLine()'? Возможно, он ждет ввода. Пауза, когда программа, казалось бы, останавливается и отлаживает ее – Jonesopolis

ответ

3

Это выглядит как один из irc.SendChatMessage() или irc.ReadMessage() является blocking, может быть, когда он выбегает из забуференного ввода/вывода и нужно ждать гнездо.

EDIT: Почти наверняка звонок irc.ReadMessage() блокируется. Он вызывает ReadLine() против потока, который, в свою очередь, связан с TcpClient. Вероятно, вы захотите изучить либо потоковые, либо асинхронные обратные вызовы, если вы хотите построить бот IRC и тестовую установку. Вот пример (не связанный с IRC): http://sunildube.blogspot.ca/2011/12/asynchronous-tcp-client-easy-example.html

+0

Хорошо. Я новичок в C# и не знаю много. Как я могу буферизировать и ждать сокета? Пожалуйста помоги. Спасибо (обновлено сообщение w/IrcClient class) –

+0

@CooperScott Обновлен мой ответ со ссылкой на простой пример. –

+0

Я вижу, спасибо. Глядя на код. Я понятия не имею, как реализовать. Говорить, что вы ответили хотя, потому что это, вероятно, ответ, и я, наверное, просто глуп. Если вы чувствуете себя хорошо. Не могли бы вы мне помочь? lol, спасибо за все до сих пор! –

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