TCP-клиент не подключается к IRC-адресу

Я пытаюсь создать twitch-чат-бота. Я прочитал несколько руководств, и вот что я закодировал до сих пор:

namespace IRC_Client
{
    class Program
    {
        public NetworkStream NetStream = null;
        public StreamReader StreamRead = null;
        public StreamWriter StreamWrite = null;

        public System.Net.Sockets.TcpClient Socket_TcpClient;

        static void Main(string[] args)
        {
            Program P = new Program();
            P.IRC_Connect();

            Console.Read();
        }

        public void IRC_Connect()
        {
            int port;
            string  nick, owner, server, oauth;

            nick = "xxx";
            Console.WriteLine("Bot Name: {0}", nick);
            oauth = "oauth:xxxxxxxxxxxxxxxxxxx";
            Console.WriteLine("Password Token: {0}", oauth);
            owner = "xxx";
            Console.WriteLine("Bot owner name: {0}", owner);
            server = "irc.twitch.tv";
            Console.WriteLine("Server name: {0}", server);                   
            port = 6667;
            Console.WriteLine("Portnummber: {0} ", port);

            try
            {
                Socket_TcpClient = new TcpClient(server, port);
            }
            catch
            {
                Console.WriteLine("Failed to connect!");
                return;
            }

            Console.WriteLine("Connected");

            IRCWork();

            try
            {
                NetStream = Socket_TcpClient.GetStream();
                StreamRead = new StreamReader(NetStream);
                StreamWrite = new StreamWriter(NetStream);
                SendData("PASS", oauth);
                SendData("NICK", nick);
            }
            catch
            {
                Console.WriteLine("Communication error");
                throw;
            }
        }

        public void SendData(string cmd, string param)
        {
            if (param == null)
            {
                StreamWrite.WriteLine(cmd);
                StreamWrite.Flush();
                Console.WriteLine(cmd);
            }
            else
            {
                StreamWrite.WriteLine(cmd + " " + param);
                StreamWrite.Flush();
                Console.WriteLine(cmd + " " + param);
            }
        }

        public void IRCWork()
        {
            string[] Text;
            string data;
            bool shouldRun = true;
            while (shouldRun)
            {
                data = StreamRead.ReadLine();
                Console.WriteLine(data);
                char[] charSeparator = new char[] { ' ' };
                Text = data.Split(charSeparator, 5);

                if (Text[0] == "PING")
                {
                    SendData("PONG", Text[1]);
                }

                if (Text.Length > 4) //is the command received long enough to be a bot command?
                {
                    string command = Text[3]; //grab the command sent

                    switch (command)
                    {
                        case ":!join":
                            SendData("JOIN", Text[4]);
                            //if the command is !join send the "JOIN" command to the server with the parameters set by the user
                            break;
                        case ":!say":
                            SendData("PRIVMSG", Text[2] + " " + Text[4]);
                            //if the command is !say, send a message to the chan (ex[2]) followed by the actual message (ex[4]).
                            break;
                        case ":!quit":
                            SendData("QUIT", Text[4]);
                            //if the command is quit, send the QUIT command to the server with a quit message
                            shouldRun = false;
                            //turn shouldRun to false - the server will stop sending us data so trying to read it will not work and result in an error. This stops the loop from running and we will close off the connections properly
                            break;
                    }
                }
            }
        }

        public void Dispose()
        {
            if (StreamRead != null)
                StreamRead.Close();
            if (StreamWrite != null)
                StreamWrite.Close();
            if (NetStream!= null)
                NetStream.Close();
            if (Socket_TcpClient != null)
                Socket_TcpClient.Close();
        }
    }
}

Основная проблема в части подключения. Я не добираюсь достаточно далеко, чтобы проверить остальное. Адрес сервера и порт должны быть правильными, но программа просто останавливается и ничего не происходит. (Я использовал информацию с этого сайта: http://help.twitch.tv/customer/com/portal/articles/1302780-twitch-irc)

try
{
    Socket_TcpClient = new TcpClient(server, port);
}

Я надеюсь, что кто-то знает ответ на мою проблему.


person JaB    schedule 25.09.2015    source источник
comment
Какие-то исключения или программа просто останавливается?   -  person Sybren    schedule 25.09.2015
comment
Хорошо, я был нетерпелив. Он выдает исключения тайм-аута через несколько минут. Но все же сервер и порт должны быть правильными.   -  person JaB    schedule 25.09.2015
comment
Можете ли вы добавить сообщения об исключениях к своему вопросу?   -  person Sybren    schedule 25.09.2015
comment
System.Net.Sockets.SocketException; Попытка подключения не удалась из-за тайм-аута или разрыва соединения с хостом. [перевод с немецкого]   -  person JaB    schedule 25.09.2015
comment
Я могу использовать telnet irc.twitch.tv на порту 6667 просто отлично. Либо что-то не так с вашей сетью, либо сервер игнорирует пакеты с вашего IP-адреса.   -  person Frédéric Hamidi    schedule 25.09.2015
comment
Вы правы, это проблема с сетью, я попробую позже из дома. Спасибо, Фредерик.   -  person JaB    schedule 25.09.2015
comment
Вам следует попробовать прочитать данные с сервера после того, как вы отправили сообщения аутентификации. Таким образом, вы уверены, что не пропустите ничего из того, что сервер должен сказать о вашем подключении и попытке аутентификации. Может быть, что-то вроде :tmi.twitch.tv NOTICE * :Error logging in, которое появляется у меня, когда я вхожу в систему с выдуманным токеном OAuth в сообщении PASS.   -  person Jessy Amyot    schedule 01.10.2015


Ответы (1)


У меня не было возможности протестировать ваш код, но я создал этот класс для своего Twitch Bot.

IrcClient.cs:

class IrcClient
{
    public string userName;
    private string channel;

    private TcpClient tcpClient;
    private StreamReader inputStream;
    private StreamWriter outputStream;

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

        tcpClient = new TcpClient(ip, port);
        inputStream = new StreamReader(tcpClient.GetStream());
        outputStream = new StreamWriter(tcpClient.GetStream());

        outputStream.WriteLine("PASS " + password);
        outputStream.WriteLine("NICK " + userName);
        outputStream.WriteLine("USER " + userName + " 8 * :" + userName);
        outputStream.Flush();
    }

    public void joinRoom(string channel)
    {
        this.channel = channel;
        outputStream.WriteLine("JOIN #" + channel);
        outputStream.Flush();
    }
}

Использование:

// Password from www.twitchapps.com/tmi/
// include the "oauth:" portion
/* main server: irc.twitch.tv, 6667 */
string oauth = "oauth:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
irc = new IrcClient("irc.twitch.tv", 6667, "BOT_NAME", oauth);
irc.joinRoom("CHANNEL_NAME");
person Simple Sandman    schedule 28.10.2015