C# 如果缓冲区中已经包含要在客户端处理的数据,如何阻止TCP发送
我一直在使用C# 如果缓冲区中已经包含要在客户端处理的数据,如何阻止TCP发送,c#,sockets,tcpclient,tcpserver,C#,Sockets,Tcpclient,Tcpserver,我一直在使用tcpsockets从服务器向客户端发送和接收数据 我正在使用以下代码 服务器 private string SendDataToClient(int currentStationSeq, int nextStationSeq, int SequenceOrder) { byte[] byData = System.Text.Encoding.ASCII.GetBytes(String.Format("{0},{1},{2}", curr
tcpsockets
从服务器向客户端发送和接收数据
我正在使用以下代码
服务器
private string SendDataToClient(int currentStationSeq, int nextStationSeq, int SequenceOrder)
{
byte[] byData = System.Text.Encoding.ASCII.GetBytes(String.Format("{0},{1},{2}", currentStationSeq, nextStationSeq, SequenceOrder));
Socket workerSocket = null;
for (int i = 0; i < m_workerSocketList.Count; i++)
{
workerSocket = (Socket)m_workerSocketList[i];
if (workerSocket != null)
{
if (workerSocket.Connected)
{
workerSocket.Send(byData);
}
}
}
}
当服务器
不连续发送时,它工作正常。但若服务器
发送数据的速度快于客户端
处理数据的速度,则数据开始在缓冲区中累积。当client
从缓冲区读取数据时,它会从缓冲区读取所有数据,从而破坏我的逻辑
我需要这样的东西:如果服务器
将数据发送到客户端
,它必须等待数据在客户端
处理,然后才能发送任何新数据
这是怎么可能的???“当客户端从缓冲区读取数据时,它会从缓冲区读取所有数据,从而破坏了我的逻辑。”-听起来您希望的是消息传递而不是流式传输。如果您希望在TCP上发送消息,则由您自己来实现它,或者转移到为您实现它的更高级别抽象。(常见的实现方法是固定大小的消息、标记字节或长度前缀消息——但黄金法则是永远不要期望一侧的
发送
调用与另一侧的接收
调用1-1匹配)“当客户端从缓冲区读取时,它从缓冲区读取所有数据,从而破坏我的逻辑。”-听起来你期待的是信息而不是流媒体。如果您希望在TCP上发送消息,则由您自己来实现它,或者转移到为您实现它的更高级别抽象。(通常的实现方法是固定大小的消息、标记字节或长度前缀消息,但黄金法则是,不要期望一侧的发送
调用与另一侧的接收
调用1-1匹配)
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.thisSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
string szData = new string(chars);
//Console.WriteLine(szData);
string[] arrData = szData.Split(',');
if (arrData.Length == 3)
{
// Some code
}
else if (arrData.Length == 2)
{
// Some Code
}
else if (arrData.Length == 1)
{
}
WaitForData();
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
}
}