gpt4 book ai didi

c# - C#网络中的同步

转载 作者:可可西里 更新时间:2023-11-01 02:40:54 25 4
gpt4 key购买 nike

我有这个简单的 tcp 服务器类

 class Server
{
private TcpListener tcpListener;
private Thread listenThread;

public Server()
{
this.tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 3000);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
Console.WriteLine("Hello");
}


private void ListenForClients()
{
this.tcpListener.Start();

while (true)
{
//blocks until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();

//create a thread to handle communication
//with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
Console.WriteLine("New connexion");
clientThread.Start(client);
}
}

private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();

Console.WriteLine("Got Stream");

byte[] message = new byte[4096];
int bytesRead;

Console.WriteLine("Initializing..");
while (true)
{
bytesRead = 0;

try
{
//blocks until a client sends a message
Console.WriteLine("Reading..");
bytesRead = clientStream.Read(message, 0, 4096);
Console.WriteLine("Received something");
}
catch
{
//a socket error has occured
break;
}

if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}

//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
Console.WriteLine(encoder.GetString(message, 0, bytesRead));

}

tcpClient.Close();
}

}

我只是像这样在主函数中调用它:

Server server = new Server();

在一个单独的客户端程序中我有这个类

class TheClient
{
public void ConnectV2()
{


TcpClient client = new TcpClient();

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

client.Connect(serverEndPoint);

NetworkStream clientStream = client.GetStream();

ASCIIEncoding encoder = new ASCIIEncoding();

for (int i = 0; i < 20; i++)
{

byte[] buffer = encoder.GetBytes("Hello Server! " + i.ToString() + " ");

Console.WriteLine("Processing..");

clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
Console.WriteLine("Hello Server sent");
}


}

}

我在主函数中调用它

TheClient tc = new TheClient();

tc.ConnectV2();

我的问题是服务器程序似乎比客户端慢,他在第 13 个或更多来自客户端的消息之前没有反应:

[因为名誉我不能发布图片]

它一次读取前十几条消息,然后一条一条地读取其他消息。

如果我让服务器先发出消息,客户端会收到消息,但它们都会停止,就像双方都在等待对方发送内容一样。

有人可以向我解释这种行为吗?如何控制和同步它?

最佳答案

TCP 不是基于消息的。它提供字节流。分隔消息是您的责任。另请注意,在一次 Read 调用中您可能只收到消息的一部分。

这是一个简单的方法:将消息作为单独的行发送。可能使用 StreamWriter。使用 StreamReader.ReadLine() 接收消息。

这样你还可以使用更合理的编码,例如 Encoding.UTF8

除此之外,您的代码实际上还不错且可行。在 Stack Overflow 上看到几乎可以工作的 TCP 代码是极其罕见的。大多数代码都被严重破坏了。恭喜。

关于c# - C#网络中的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29552133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com