簡體   English   中英

TCP客戶端-服務器連接

[英]TCP client - server connection

我試圖讓客戶端使用 TCP 從服務器獲取一些數據。 但它只工作一次。 那么 stream.DataAvailable 總是假的。

客戶端代碼:

while (!StopEvent.WaitOne(WaitTime, true))
            {
                try
                {
                    if (TcpClient == null || !TcpClient.Connected)
                    {
                        if (TcpClient != null)
                        {
                            TcpClient.Close();
                            TcpClient = null;
                        }
                        TcpClient = new TcpClient(MasterHost, MasterMonitoringPort) {NoDelay = true};
                    }

                    var stream = TcpClient.GetStream();
                    stream.WriteTimeout = TimeoutMs;
                    stream.ReadTimeout = TimeoutMs;

                    stream.Write(GetMasterStateRequestBytes, 0, GetMasterStateRequestBytes.Length);

                    var serialisedDataBuilder = new StringBuilder();

                    if (stream.DataAvailable)
                    {

                        while (stream.DataAvailable)
                        {
                            var bytesRead = stream.Read(BytesBuffer, 0, BytesBuffer.Length);
                            serialisedDataBuilder.Append(Encoding.UTF8.GetString(BytesBuffer, 0, bytesRead));
                        }

                        var responses = MonitoringResponse.StringToResponses(serialisedDataBuilder.ToString());

                        foreach (var response in responses)
                        {
                            if (response.MonitoringResponseType == MonitoringResponseType.ProvideMasterStateInfo && response.Parameters is MasterStateInfo masterStateInfo)
                                MasterStateInfo = masterStateInfo;
                        }
                    }
                }
                catch (Exception exception)
                {
                    LastException = exception;
                    TcpClient?.Close();
                    TcpClient = null;
                }

                Thread.Sleep(10*1000);
            }

服務器代碼:

while (!StopEvent.WaitOne(WaitTime, true))
            {
                try
                {
                    if (TcpListener == null)
                    {
                        Application.Tracer.Trace(this, TracerEventKind.Info, "Starting TcpListener");
                        TcpListener = new TcpListener(IPAddress.Any, MasterNetworkServer.MonitoringPort);
                        TcpListener.Start();
                    }

                    if (TcpListener.Pending())
                    {
                        Application.Tracer.Trace(this, TracerEventKind.Info, "TcpListener is pending, start processing");
                        var client = TcpListener.AcceptTcpClient();
                        var stream = client.GetStream();
                        stream.WriteTimeout = TimeoutMs;
                        stream.ReadTimeout = TimeoutMs;
                        var serialisedDataBuilder = new StringBuilder();

                        if (stream.DataAvailable)
                        {
                            do
                            {
                                var bytesRead = stream.Read(BytesBuffer, 0, BytesBuffer.Length);
                                serialisedDataBuilder.Append(Encoding.UTF8.GetString(BytesBuffer, 0, bytesRead));
                            } while (stream.DataAvailable);

                            Application.Tracer.Trace(this, TracerEventKind.Info, "Bytes received");

                            var requests =
                                MonitoringRequest.StringToRequests(serialisedDataBuilder.ToString(), distinct: true);

                            var responses = new List<MonitoringResponse>();

                            if (requests.Any())
                            {
                                Application.Tracer.Trace(this, TracerEventKind.Info,
                                    $"Start to processing {requests.Count} requests");

                                foreach (var request in requests)
                                {
                                    responses.Add(HandleMonitoringRequest(request));
                                    Application.Tracer.Trace(this, TracerEventKind.Info, "Response made");
                                }

                                Application.Tracer.Trace(this, TracerEventKind.Info, "All responses made");
                            }

                            var responsesBytes = MonitoringResponse.ResponsesToBytes(responses);

                            stream.Write(responsesBytes, 0, responsesBytes.Length);
                        }
                    }
                }
                catch(Exception exception)
                {
                    Application.Tracer.Trace(this, TracerEventKind.Info, $"Monitoring network service exception: {exception.Message}");
                }

                Thread.Sleep(0);

避免愚蠢的限制文本。 避免愚蠢的限制文本。 避免愚蠢的限制文本。 避免愚蠢的限制文本。 避免愚蠢的限制文本。 避免愚蠢的限制文本。

修復它的方法是在每個 session 之后關閉 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 和客戶端(使用方法.Close() ),並在檢查 isDataAvailable 之前添加一些睡眠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM