使用网络流和流读取器从网络读取流

  • 本文关键字:读取 网络 c# sockets stream irc
  • 更新时间 :
  • 英文 :

  • 我正在尝试使用异步使用 C# 代码连接到 IRC 服务器NetworkStream 和 StreamReader 的方法。
    • 似乎连接阶段已成功完成,但是当我尝试读取数据时,它卡住了。
    • 我一行
    • 一行地阅读,直到读者。已达到流的尽头(也尝试阅读器。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}rn", message));
        Console.WriteLine("[S] {0}", message);
        await stream.WriteAsync(command, 0, command.Length);
        await stream.FlushAsync();
        Thread.Sleep(1000);
    }
}

问题出在做...while 循环在 ConnectComplete()

到目前为止的输出是:注意身份验证:* 查找您的主机名通知身份验证:检查身份注意身份验证:找到您的主机名注意身份验证:* 无识别响应

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

当远程端关闭连接(或关闭发送)时,流结束。我认为 IRC 协议并非如此。

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

因此,您必须停止基于数据的读取。也许您可以检测到一些命令告诉您继续前进。

相关内容

  • 没有找到相关文章

最新更新