【问题标题】:StreamSocket, DataWriter.StoreAsync(), DataReader.LoadAsync() -- Asynchronous problemsStreamSocket、DataWriter.StoreAsync()、DataReader.LoadAsync()——异步问题
【发布时间】:2014-02-17 00:02:08
【问题描述】:

我正在创建一个 Win 8 商店应用程序,在该应用程序中我使用 StreamSocket 连接到用 Java 编写的服务器。当我在调试中运行应用程序时,在 StreamSocket.ConnectAsync(...)、DataWriter.StoreAsync() 和 DataReader.LoadAsync(...) 上有断点,它会连接、发送消息并接收回消息。但是,一旦我删除了任何一个断点,该方法就不起作用了。我怎样才能解决这个问题?这是我的代码:

public async void Connect()
{
    try
    {
        await socket.ConnectAsync(new Windows.Networking.HostName(ip),
            "50000", SocketProtectionLevel.PlainSocket);
        Connected = true;
    }
    catch (Exception e)
    {
        if (SocketError.GetStatus(e.HResult) == SocketErrorStatus.Unknown)
        {
            throw;
        }

        Windows.UI.Popups.MessageDialog md =
            new Windows.UI.Popups.MessageDialog("Error: " + e.Message);
        return;
    }
    return;

}

public async void HandShake()
{
    try
    {

        //output
        writer = new DataWriter(socket.OutputStream);
        writer.UnicodeEncoding = 
             Windows.Storage.Streams.UnicodeEncoding.Utf8;

        byte[] nameBytes = Encoding.UTF8.GetBytes(Name.ToCharArray());
        writer.WriteBytes(nameBytes);
        await writer.StoreAsync();

        await writer.FlushAsync();
        writer.DetachStream();
        writer.Dispose();


        //input
        reader = new DataReader(socket.InputStream);
        reader.InputStreamOptions = InputStreamOptions.Partial;
        reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;

        uint bytesAvailable = await reader.LoadAsync(4096);
        byte[] byArray = new byte[bytesAvailable];
        reader.ReadBytes(byArray);
        string temp = Encoding.UTF8.GetString(byArray, 0,
            Convert.ToInt32(bytesAvailable));

        temp = temp.Substring(0, temp.Length - 1);

        if (temp == "NAME OK")
        {
            GoodName = true;
        }

        reader.DetachStream();
        reader.Dispose();
    }
    catch (Exception e)
    {
        //await Task.WhenAll(tasks.ToArray());
        if (SocketError.GetStatus(e.HResult) == SocketErrorStatus.Unknown)
        {
            throw;
        }

        Windows.UI.Popups.MessageDialog md =
            new Windows.UI.Popups.MessageDialog("Error: " + e.Message);
        md.ShowAsync();
    }
}

【问题讨论】:

    标签: c# sockets networking asynchronous windows-8


    【解决方案1】:

    LoadAsync 默认情况下不会阻塞,直到所有请求的字节都被读取。您可能收到了部分消息。

    您需要实现您的协议使用的任何类型的message framing,正如我在博客中所描述的那样。

    附:避免async void。这确实使您的错误处理变得复杂。

    【讨论】:

    • 问题是如果我删除断点,它不会连接到服务器,如果我在 connectasync 和 loadasync 上添加断点,服务器不会收到消息。关键是,如果没有断点,就好像跳过了这些方法。
    【解决方案2】:

    我将 Connect() 的返回类型更改为 Task。然后这样称呼它,await Connect(); 我将发送和接收代码放在不同的方法中并做了同样的事情。我的问题是一个异步问题,这解决了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2017-12-31
      • 1970-01-01
      • 2010-12-16
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多