我制作了一个简单的"反向壳牌"在C#中,最多5个客户端可以连接到服务器 客户端需要输入一个命令,我做了一个允许客户端相互通信的命令,问题是当客户端3向客户端1发送消息时,它只会在客户端1按下回车后显示此消息,如何来吧,无论如何,我都会让它显示出来?
这是我用来接收数据并显示它的代码:
while (true)
{
Console.Write("> ");
string cmd = Console.ReadLine();
byte[] buffer = Encoding.UTF8.GetBytes(cmd);
client.Send(buffer, 0, buffer.Length, 0);
byte[] recievedBuffer = new byte[1024];
int rec = client.Receive(recievedBuffer);
byte[] data = new byte[rec];
Array.Copy(recievedBuffer, data, rec);
Console.WriteLine(Encoding.UTF8.GetString(data));
}
答案 0 :(得分:0)
我假设您正在使用Socket。
您需要创建一个单独的Thread(System.Threading.Thread)来监听命令,并创建一个不同的线程来获取输入。当您要求用户输入时,您还必须确保不打印任何内容。
您还需要确保收到整个命令,而不仅仅是其中的一部分。
答案 1 :(得分:0)
我认为问题正在发生,因为在您的循环中,您首先必须发送数据,然后才能收到任何数据。
while (true)
{
//must send data
client.Send(buffer, 0, buffer.Length, 0);
//then receive
int rec = client.Receive(recievedBuffer);
}
按下输入client1实际上根据你的程序发送数据,然后他可以自由地让messgae client3发送给他。
由于这种实现,您必须首先发送数据然后必须接收等等,这是非常有限的行为。
如果您希望客户端在发送消息时获取消息,则需要使用另一个线程在某些时间间隔内检查消息是否已到达,类似计时器的操作非常有用。
如果您决定在多线程环境中工作,请小心并使用适当的同步来防止线程之间的竞争条件。
另一个选择是基于Asynchronous Client Socket想法去异步并实现某些东西。