Я создаю простую программу чата tcp / ip, и мне трудно отправлять сообщения отдельно.Если, например, я отправляю два сообщения, и оба имеют содержимое, превышающее размер буфера, который может содержать 20 символов, отправляется 20 символов первого сообщения, затем отправляется 20 символов следующего сообщения, а затем оставшаяся часть первого сообщения, а затемостальная часть последнего сообщения.Поэтому, когда я анализирую и объединяю строки, я получаю два сообщения: начало первого сообщения и начало второго, конец первого и конец второго соответственно.Я хочу знать, как отправить сообщение, и ставить в очередь следующие сообщения, пока первое сообщение не будет отправлено.В качестве примечания я использую асинхронные вызовы методов, а не потоки.
Мой код:
Клиент:
protected virtual void Write(string mymessage)
{
var buffer = Encoding.ASCII.GetBytes(mymessage);
MySocket.BeginSend(buffer, 0, buffer.Length,
SocketFlags.None,EndSendCallBack, null);
if (OnWrite != null)
{
var target = (Control) OnWrite.Target;
if (target != null && target.InvokeRequired)
{
target.Invoke(OnWrite, this, new EventArgs());
}
else
{
OnWrite(this, new EventArgs());
}
}
}
и два смешанных вызова:
client.SendMessage("CONNECT",Parser<Connect>.TextSerialize(connect));
client.SendMessage("BUDDYLIST","");
и, наконец, функция чтения (Iиспользуйте номер в начале каждого сообщения, чтобы узнать, когда оно заканчивается в квадратных скобках):
private void Read(IAsyncResult ar)
{
string content;
var buffer = ((byte[]) ar.AsyncState);
int len = MySocket.EndReceive(ar);
if (len > 0)
{
string cleanMessage;
content = Encoding.ASCII.GetString(buffer, 0, len);
if (MessageLength == 0)
{
MessageLength = int.Parse(content.Substring(1, content.IndexOf("]", 1) - 1));
cleanMessage = content.Replace(content.Substring(0, content.IndexOf("]", 0) + 1), "");
}
else
cleanMessage = content;
if(cleanMessage.Length <1)
{
if(MySocket.Connected)
MySocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Read), buffer);
return;
}
MessageLength = MessageLength > cleanMessage.Length? MessageLength - cleanMessage.Length : 0;
amessage += cleanMessage;
if(MessageLength == 0)
{
if (OnRead != null)
{
var e = new CommandEventArgs(this, amessage);
Control target = null;
if (OnRead.Target is Control)
target = (Control)OnRead.Target;
if (target != null && target.InvokeRequired)
target.Invoke(OnRead, this, e);
else
OnRead(this, e);
}
amessage = String.Empty;
}
MySocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Read), buffer);
return;
}
}