【发布时间】:2014-02-24 21:53:45
【问题描述】:
我编写了一个 C# 聊天软件,它使用了一个新的(至少对我而言)系统,我称之为请求系统。我不知道以前是否已经创建过,但现在我认为它是我的创作:P
无论如何,这个系统是这样工作的:
- soc收到信号
- 检查信号
- 如果刚刚收到的数据是数字2,客户端软件就知道服务器要发送聊天消息了。如果数字是3,则客户端知道服务器即将发送成员列表,依此类推。
问题是这样的:当我在 VS2012 中逐步执行时,它工作正常,聊天工作正常。当我在调试模式下使用它或只是在我的桌面上运行它时,似乎缺少数据,这不应该是因为代码运行良好......
客户端收发消息代码示例:
public void RecieveSystem()
{
while (true)
{
byte[] req = new byte[1];
soc.Receive(req);
int requestID = int.Parse(Encoding.UTF8.GetString(req));
if (requestID == 3)
{
byte[] textSize = new byte[5];
soc.Receive(textSize);
byte[] text = new byte[int.Parse(Encoding.UTF8.GetString(textSize))];
soc.Receive(text);
Dispatcher.Invoke(() => { ChatBox.Text += Encoding.UTF8.GetString(text) + "\r\n"; });
}
}
}
public void OutSystem(string inputText)
{
byte[] req = Encoding.UTF8.GetBytes("3");
soc.Send(req);
byte[] textSize = Encoding.UTF8.GetBytes(Encoding.UTF8.GetByteCount(inputText).ToString());
soc.Send(textSize);
byte[] text = Encoding.UTF8.GetBytes(inputText);
soc.Send(text);
Thread.CurrentThread.Abort();
}
在服务器上:
public void UpdateChat(string text)
{
byte[] req = Encoding.UTF8.GetBytes("3");
foreach (User user in onlineUsers)
user.UserSocket.Send(req);
byte[] textSize = Encoding.UTF8.GetBytes(Encoding.UTF8.GetByteCount(text).ToString());
foreach (User user in onlineUsers)
user.UserSocket.Send(textSize);
byte[] data = Encoding.UTF8.GetBytes(text);
foreach (User user in onlineUsers)
user.UserSocket.Send(data);
}
public void RequestSystem(Socket soc)
{
~~~
}
else if (request == 3)
{
byte[] dataSize = new byte[5];
soc.Receive(dataSize);
byte[] data = new byte[int.Parse(Encoding.UTF8.GetString(dataSize))];
soc.Receive(data);
UpdateChat(Encoding.UTF8.GetString(data));
}
}
catch
{
if (!soc.Connected)
{
Dispatcher.Invoke(() => { OnlineMembers.Items.Remove(decodedName + " - " + soc.RemoteEndPoint); Status.Text += soc.RemoteEndPoint + " Has disconnected"; });
onlineUsers.Remove(user);
Thread.CurrentThread.Abort();
}
}
}
}
可能是什么问题?
【问题讨论】:
-
服务器代码示例中的“~~~”部分是什么?这是一个不重要的代码还是你错过了什么?
-
你可能对我的文章here感兴趣,尤其是题为“意识流-他说了很多,但没有真正意义!”的部分!
-
TCP 不在 C# 中,TCP 不会丢包。
-
@aleksey.berezan 这是一个不重要的代码 :) EJP 我知道,我从来没有说过它在 C# 中......而且我知道它不会丢失数据包,这就是为什么我感到困惑并认为出了点问题。我的代码现在可以工作,但我还有另一个问题。如果你能在那里帮助我,我会很高兴:) stackoverflow.com/questions/22022162/…