【问题标题】:reading stream from network using networkstream and streamreader使用 networkstream 和 streamreader 从网络读取流
【发布时间】:2015-04-22 08:42:10
【问题描述】:
  • 我正在尝试使用 C# 代码使用异步连接到 IRC 服务器 NetworkStream 和 StreamReader 的方法。
    • 似乎连接阶段已成功完成,但是 当我尝试读取数据时,它卡住了。
    • 我正在逐行阅读,直到达到 reader.EndOfStream(也 尝试了 reader.Peek() != -1),但循环仍然没有结束......

这是我正在使用的代码:

public class MainViewModel : ViewModelBase
{
    public string HostAddress { get; set; }
    public int Port { get; set; }

    public MainViewModel()
    {
        HostAddress = "amsterdam.nl.eu.undernet.org";
        Port = 6667;

        Connect(HostAddress);
    }

    private void Connect(string hostAddress)
    {
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.BeginConnect(hostAddress, Port, ConnectCompleted, socket);
    }

    private async void ConnectCompleted(IAsyncResult ar)
    {
        var socket = (Socket)ar.AsyncState;
        socket.EndConnect(ar);

        var networkStream = new NetworkStream(socket);
        var reader = new StreamReader(networkStream, Encoding.UTF8);


        do
        {
            var line = await reader.ReadLineAsync();

            Console.WriteLine(line);

        } while (!reader.EndOfStream);

        // Not getting here

        await WriteAsync("NICK mickey", networkStream);
        await WriteAsync("USER mickey 8 * : realname", networkStream);

        do
        {
            var line = await reader.ReadLineAsync();

            Console.WriteLine(line);

        } while (!reader.EndOfStream);


        reader.Close();
        networkStream.Close();
        socket.Close();
    }



    private async Task WriteAsync(string message, NetworkStream stream)
    {
        var command = Encoding.UTF8.GetBytes(string.Format("{0}\r\n", message));

        Console.WriteLine("[S] {0}", message);

        await stream.WriteAsync(command, 0, command.Length);

        await stream.FlushAsync();

        Thread.Sleep(1000);
    }
}

问题出在 ConnectCompleted() 中的 Do...While 循环中

目前的输出是: NOTICE AUTH :* 查找您的主机名 NOTICE AUTH : 检查身份 NOTICE AUTH : 找到您的主机名 NOTICE AUTH :* 没有 ident 响应

  • 然后卡住了...请帮助我了解流何时结束。

【问题讨论】:

  • 我没有读到任何关于 IRC 协议的内容,但是服务器会在你对它说话之前向你发送数据吗?它通常的工作方式是:客户端连接到服务器,它告诉服务器它想要什么,然后服务器做出响应。
  • 连接无限期保持打开状态,reader.EndOfStream 将保持为假,直到连接完全关闭。不要等待它关闭,而是无限期地保持读取循环打开并写入另一个线程中的连接。这样你只需要一个阅读循环而不是两个。

标签: c# sockets stream irc


【解决方案1】:

当远程端关闭连接(或关闭发送)时,流结束。我认为 IRC 协议不是这种情况。

无法确定当前是否没有可用数据或远程端是否不再发送数据。我想新的 IRC 消息可能随时到达。

因此,您必须停止根据数据进行阅读。也许有一些你可以检测到的命令告诉你继续前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多