我目前正在开发一个聊天客户端(Windows应用商店应用程序 - C#),我目前正在注册部分。在我将相关数据(如用户名,密码,电子邮件等)发送到服务器以创建新用户之前,我调用“CheckSignUp(...)”函数,该函数首先检查用户名是否已存在。它首先发送关键字/ F011 /然后是用户名,然后我应该收到关键字OK或NOK(用户名已经存在)。这是代码:
public async Task<string> CheckSignUp(string username)
{
writer.WriteString("/F011/" + "\n");
writer.WriteString(username + "\n");
await writer.StoreAsync();
reader.InputStreamOptions = InputStreamOptions.Partial;
string result = reader.ReadString(await reader.LoadAsync(3));
return result;
}
按下“注册”按钮时调用此功能。问题是我在第二次按下“注册”按钮后才收到错误。这是Button_click事件的相关代码:
private async void bnSignUp_Click(object sender, RoutedEventArgs e)
{
...
string ValidUser = await App.ChatConnection.CheckSignUp(tbUserName.Text);
if (ValidUser == "NOK")
{
FailText.Children.Add(new InfoTextBox("Error! Username already exists."));
tbUserName.Text = "";
}
....
}
在建立与服务器的连接时,会发生reader
和writer
个对象的创建:
socket = new StreamSocket();
HostName hostname = new HostName(host);
await socket.ConnectAsync(hostname, port);
writer = new DataWriter(socket.OutputStream);
reader = new DataReader(socket.InputStream);
编辑:我尝试登录时也遇到同样的问题(Login()函数与CheckSignUp函数类似):
public async Task<string> Login(string username, string password)
{
writer.WriteString("/F050/" + "\n");
writer.WriteString(GetHash(password) + "\n");
writer.WriteString("\n");
writer.WriteString(username + "\n");
await writer.StoreAsync();
reader.InputStreamOptions = InputStreamOptions.Partial;
return reader.ReadString(await reader.LoadAsync(3));
}
答案 0 :(得分:2)
我建议您首先尽力不使用TCP / IP。使用WebAPI,SignalR等
如果你 需要 来使用TCP / IP,那么你需要实现message framing,正如我在博客中描述的那样。
答案 1 :(得分:0)
您可能需要刷新编写器,以便实际通过套接字发送数据而不是缓冲。
public async Task<string> CheckSignUp(string username)
{
writer.WriteString("/F011/" + "\n");
writer.WriteString(username + "\n");
await writer.StoreAsync();
await writer.FlushAsync();
// ..rest of code...
}