我以前從未使用UDP,所以我放棄了它。爲了看看會發生什麼,我讓「服務器」每半秒發送一次數據,客戶端每3秒收到一次數據。因此,即使服務器發送數據的速度比客戶端可以接收的速度快得多,客戶端仍然可以一個接一個地整齊地接收數據。UDP存儲的數據在哪裏?
任何人都可以解釋爲什麼/這是怎麼發生的?數據在哪裏準確緩衝?
發送
class CSimpleSend
{
CSomeObjServer obj = new CSomeObjServer();
public CSimpleSend()
{
obj.changedVar = varUpdated;
obj.threadedChangeSomeVar();
}
private void varUpdated(int var)
{
string send = var.ToString();
byte[] packetData = System.Text.UTF8Encoding.UTF8.GetBytes(send);
string ip = "127.0.0.1";
int port = 11000;
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ip), port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SendTo(packetData, ep);
Console.WriteLine("Sent Message: " + send);
Thread.Sleep(100);
}
}
所有CSomeObjServer確實是增加一個整數由一個每半秒
接收
class CSimpleReceive
{
CSomeObjClient obj = new CSomeObjClient();
public Action<string> showMessage;
Int32 port = 11000;
UdpClient udpClient;
public CSimpleReceive()
{
udpClient = new UdpClient(port);
showMessage = Console.WriteLine;
Thread t = new Thread(() => ReceiveMessage());
t.Start();
}
private void ReceiveMessage()
{
while (true)
{
//Thread.Sleep(1000);
IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, port);
byte[] content = udpClient.Receive(ref remoteIPEndPoint);
if (content.Length > 0)
{
string message = Encoding.UTF8.GetString(content);
if (showMessage != null)
showMessage("Recv:" + message);
int var_out = -1;
bool succ = Int32.TryParse(message, out var_out);
if (succ)
{
obj.alterSomeVar(var_out);
Console.WriteLine("Altered var to :" + var_out);
}
}
Thread.Sleep(3000);
}
}
}
CSomeObjClient存儲變量和具有一個功能(alterSomeVar)來更新它
輸出繼電器:
Sent Message: 1
Recv:1
Altered var to :1
Sent Message: 2
Sent Message: 3
Sent Message: 4
Sent Message: 5
Recv:2
Altered var to :2
Sent Message: 6
Sent Message: 7
Sent Message: 8
Sent Message: 9
Sent Message: 10
Recv:3
Altered var to :3
我舉雙手贊成你的好奇本性,+1 – spender
操作系統具有網絡棧通常有一些緩衝區......只要你發送的內容適合這些緩衝區沒有問題...因爲UDP不能保證無論如何數據可能被丟棄等。 – Yahia
客戶端和服務器是否在同一臺機器上運行? – grieve