私は単純なtcp/ipチャットプログラムを構築しています。たとえば、2つのメッセージを送信し、両方が20文字を保持できるバッファより大きい場合、最初のメッセージの20文字が送信され、次のメッセージの20文字が送信され、最初のメッセージの残りの部分最後のメッセージの残りの部分。だから私は文字列を解析して連結すると、最初のメッセージの始めと2番目のメッセージの始めと2番目のメッセージの最初と最後の2つのメッセージが得られます。私はメッセージを送信する方法を知りたいし、最初のメッセージがすでに送信されるまで次のメッセージを待ち行列に入れたい。私は非同期メソッド呼び出しとスレッドを使用しています。TCP/IPチャットプログラムが私に混在メッセージを送信しています
マイコード:
クライアント:
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","");
、最終的には、読み取り機能(私はすべての先頭に番号を使用しますメッセージが角括弧で囲まれたときを知るメッセージ):
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;
}
}
TCPはメッセージの概念では機能しません。それは流れと何も与えません。ストリームをメッセージに分割するメカニズムを作成する必要があります。 – CodesInChaos
私は文字列の先頭に括弧で囲まれた数字を持っています。メッセージの終わりを知るには[3]ねえ。問題は私が[3]方法とあなた[3]をあなたに送ったなら、私は[3] h、それから[3] y、そして 'それはバッファが4の場合だけです。 – Eitan
"[3] how [3]あなた"を送り、 "[3] h [3] yowyou"を受け取りますか?私には信じられないほどの音。しかし、私は通常、自分のネットワークコードをシングルスレッドで書く。私はあなたのスレッドコードが正しく書かれていないと思われます。 – CodesInChaos