我在我的應用程序中實現主/從體系結構。.Net套接字客戶端數據接收問題
Master從數據庫輪詢作業,然後在作業中分配作業。我使用套接字連接來維護主從機之間的連接並將作業發送到客戶機。
只要主服務器啓動進程,一個線程開始創建作業隊列,另一個線程開始從隊列中獲取作業,並逐個將其連接到所有連接的從服務器。從機完成作業後,它會向主機發送一些確認信息,表明它是空閒的,並且再次將主機作業提供給該客戶機。如果隊列爲空,則主服務器向客戶端發送一些確認,之後客戶端再次向主服務器發送一些確認,主服務器再次檢查隊列併發送作業(如果可用)。這個過程一直持續下去,直到主人決定完成所有的工作。
確認只是一些不變的價值。無論何時客戶端收到此常量值,客戶端都會將相同的值發送回主服務器,並且如果主服務器接收到此常量值,則會發送作業(如果隊列中可用),否則將相同的值發送回客戶端。這樣,主人和奴隸繼續溝通,直到工作完成。
我正在使用異步套接字的c#windows服務器。
我的問題是在處理客戶端收到的數據時,有時客戶端正在獲取重疊值。這是發生在客戶端套接字的下列事件:
public void OnDataReceived(IAsyncResult asyn)
{
SocketPacket theSockId = null;
try
{
theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
if (OnDataRecievedFromMaster != null)
{
OnDataRecievedFromMaster(Convert.ToInt32(szData), theSockId.hostName);
}
//richTextRxMessage.Text = richTextRxMessage.Text + szData;
WaitForData(theSockId.hostName);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
if (se.ErrorCode == 10054) // Error code for Connection reset by peer
{
//string msg = "Client " + socketData.hostName + " Disconnected" + "\n";
//AppendToRichEditControl(msg);
// Remove the reference to the worker socket of the closed client
// so that this object will get garbage collected
}
}
finally
{
}
}
在這種情況下,szdata的價值是不是真正的高手發出的原始值。大多數時候價值重複。我只發送整數值到客戶端或服務器,沒有字符串。
爲什麼我得到這個任何種類的輸入將真正讚賞。
你的字符串處理是比較奇怪的(和馬車:緩衝區太小,你就不能使用Encoding.GetString?)。此外,您似乎認爲讀取會返回完整的「消息」。 TCP沒有消息。 Read可以返回比發送的字節數少的字節。另外,你爲什麼將整數作爲字符串發送?只需將它們發送爲固定長度的4字節消息即可。 – usr 2013-12-28 15:44:26