我正在创建一个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();
}
}
答案 0 :(得分:4)
LoadAsync
在读取所有请求的字节之前不会阻塞。您可能收到了部分消息。
您需要实现协议使用的任何类型的message framing,正如我在博客中所描述的那样。
P.S。避免使用async void
。它确实使您的错误处理变得复杂。
答案 1 :(得分:1)
我将Connect()的返回类型更改为Task。然后调用它,await Connect();
我将发送和接收代码放在不同的方法中并做同样的事情。我的问题是异步问题,这解决了它。