gpt4 book ai didi

c# - 套接字开始变慢并且没有响应

转载 作者:行者123 更新时间:2023-12-03 12:01:12 26 4
gpt4 key购买 nike

我正在开发服务器(使用C#)和客户端(使用Flash,ActionScript 3.0)应用程序。服务器连续向客户端发送数据(数据约90个字节),客户端根据收到的数据进行操作(数据采用json格式)

有一阵子,一切都按预期工作,但是经过一段时间后,客户端开始收到迟钝的消息。他们持续等待一段时间,然后根据最后一条消息(某些消息丢失)进行操作。经过一段时间后,客户端开始等待并同时处理所有消息。我不知道是什么原因造成的。我的网络状况稳定。

这是我的C#代码的一部分,发送消息:

public void Send(byte[] buffer)
{
if (ClientSocket != null && ClientSocket.Connected)
{
ClientSocket.BeginSend(buffer, 0, buffer.Length, 0, WriteCallback, ClientSocket);
}
}

private void WriteCallback(IAsyncResult result)
{
//
}

和我的客户的某些部分,收到消息( ActionScript )
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
function onResponse(e:ProgressEvent):void {
trace(socket.bytesAvailable);
if(socket.bytesAvailable > 0) {
try
{
var serverResponse:String = socket.readUTFBytes(socket.bytesAvailable);

....

我希望我能解释我的问题。我应该如何优化我的代码?可能导致滞后的原因。谢谢。

最佳答案

您确实需要提供有关如何设置套接字的更多详细信息(是TCP还是UDP?)

假设它是一个TCP套接字,那么看来您的客户端依赖于每个接收调用,返回的返回字节数与服务器的Send()调用发送的字节数相同。但是,情况并非如此,如果在客户端上仅部分接收到一条消息,或者一次接收到多条消息,则很可能是造成问题的原因。

例如,服务器可能在单个调用中发送90字节的消息,但是您的客户端可能以90字节的接收,两个45字节的块,甚至90 x 1字节的块或两者之间的任何内容接收消息。服务器发送的多个消息在被客户端接收时也可以部分合并。例如。可以在单个180字节块,150字节和30字节块等中接收到两个90字节消息。

因此,您需要在消息上提供某种框架,以便当客户端接收到数据流时,可以将其可靠地重建为单独的消息。

最基本的成帧机制是为每个发送的消息添加一个固定长度的字段,以指示消息的大小。如果可以保证您的消息永远不会大于255个字节,那么您也许可以只用一个字节就可以了,这将简化接收代码。

在客户端,您首先需要接收长度前缀,然后从套接字读取多达这么多字节以构造消息数据。如果您收到的字节数少于要求的字节数,则您的接收代码必须等待更多的数据(最终将其追加到部分接收的消息中),直到收到完整的消息为止。

收到完整的消息后,就可以按照您当前的状态对其进行处理。

不幸的是,我不知道ActionScript,因此无法为您提供客户端代码示例,但是您可以按照以下方法用C#编写服务器和客户端框架:

服务器端:

public void SendMessage(string message)
{
var data = Encoding.UTF8.GetBytes(message);
if (data.Length > byte.MaxValue) throw new Exception("Data exceeds maximum size");
var bufferList = new[]
{
new ArraySegment<byte>(new[] {(byte) data.Length}),
new ArraySegment<byte>(data)
};
ClientSocket.Send(bufferList);
}

客户端:
public string ReadMessage()
{
var header = new byte[1];
// Read the header indicating the data length
var bytesRead = ServerSocket.Receive(header);
if (bytesRead > 0)
{
var dataLength = header[0];
// If the message size is zero, return an empty string
if (dataLength == 0) return string.Empty;
var buffer = new byte[dataLength];
var position = 0;
while ((bytesRead = ServerSocket.Receive(buffer, position, buffer.Length - position, SocketFlags.None)) > 0)
{
// Advance the position by the number of bytes read
position += bytesRead;
// If there's still more data to read before we have a full message, call Receive again
if (position < buffer.Length) continue;
// We have a complete message - return it.
return Encoding.UTF8.GetString(buffer);
}
}
// If Receive returns 0, the socket has been closed, so return null to indicate this.
return null;
}

关于c# - 套接字开始变慢并且没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005667/

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