Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的异步tcp客户端正在连接到API。。。零星错误_C#_Api_Sockets_Asynchronous_Tcp - Fatal编程技术网

C#中的异步tcp客户端正在连接到API。。。零星错误

C#中的异步tcp客户端正在连接到API。。。零星错误,c#,api,sockets,asynchronous,tcp,C#,Api,Sockets,Asynchronous,Tcp,我正在用C#编写一个TCP客户端,用于连接第三方API服务器。供应商坚持认为问题在于我们的代码。他们提供了一个示例TCP client.exe,以针对他们的API进行测试。我通常成功地使用他们的应用程序和数据包发送器连接到他们的API。不过,我无法在代码中找出问题所在,因此我希望能得到一些帮助,帮助我发现哪里出了问题 我必须进行初始调用以确保设置正确,然后才能进行API调用。似乎API调用只在异步调用时返回结果。我将连续获得2到3次成功的结果,然后我将获得一条无法识别的错误消息,而无需访问供应商

我正在用C#编写一个TCP客户端,用于连接第三方API服务器。供应商坚持认为问题在于我们的代码。他们提供了一个示例TCP client.exe,以针对他们的API进行测试。我通常成功地使用他们的应用程序和数据包发送器连接到他们的API。不过,我无法在代码中找出问题所在,因此我希望能得到一些帮助,帮助我发现哪里出了问题

我必须进行初始调用以确保设置正确,然后才能进行API调用。似乎API调用只在异步调用时返回结果。我将连续获得2到3次成功的结果,然后我将获得一条无法识别的错误消息,而无需访问供应商的源代码。我从MSDN示例或其他著名的地方获得了这段代码,但似乎每隔5次调用(当我收到错误时是不一致的)API就会出错(它会挂起并停止响应,直到我重新启动它)。有人能帮我调试代码吗?我对它进行了一般化,这样我就不会在这里放置任何特定于供应商API的内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace tcp
{
    class AsyncClient
    {
        static void Main(string[] args)
        {
            SetInitialSetting();
            ConnectAsTcpClient();
            Console.ReadLine();
        }

        private static void SetInitialSetting()
        {
            byte[] data = new byte[1024];
            string stringData;
            IPAddress ip;
            int port;
            int recv;
            IPAddress.TryParse(@"127.0.0.1", out ip);
            port = 10000;
            SetInitialSettingString();
            Console.WriteLine("[Client] Writing request {0}", ClientRequestString);
            using (var client = new TcpClient(ip.ToString(), port))
            {
                NetworkStream ns = client.GetStream();
                ns.Write(ClientRequestBytes, 0, ClientRequestBytes.Length);
                stringData = "";
                do
                {
                    recv = ns.Read(data, 0, data.Length);
                    stringData = stringData + Encoding.UTF8.GetString(data, 0, recv);
                }
                while (ns.DataAvailable);
                Console.WriteLine("[Client] Server response was {0}", stringData);
                ns.Close();
            }
        }

        private static async void ConnectAsTcpClient()
        {
            byte[] data = new byte[10025];
            IPAddress ip;
            int port;
            IPAddress.TryParse(@"127.0.0.1", out ip);
            port = 10000;
            using (var tcpClient = new TcpClient())
            {
                Console.WriteLine("[Client] Connecting to server");
                await tcpClient.ConnectAsync(ip, port);
                Console.WriteLine("[Client] Connected to server");
                using (var networkStream = tcpClient.GetStream())
                {
                    SetAPICallString();
                    Console.WriteLine("[Client] Writing request {0}", ClientRequestString);
                    await networkStream.WriteAsync(ClientRequestBytes, 0, ClientRequestBytes.Length);
                    var buffer = new byte[4096];
                    var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);
                    var response = Encoding.UTF8.GetString(buffer, 0, byteCount);
                    Console.WriteLine("[Client] Server response was {0}", response);
                }
            }
        }

        private static string ClientRequestString;
        private static byte[] ClientRequestBytes;
        private static void SetInitialSettingString()
        {
            ClientRequestString = "StringThatSetsTheAPISettingGoesHere";
            ClientRequestBytes = Encoding.UTF8.GetBytes(ClientRequestString);
        }

        private static void SetAPICallString()
        {
            ClientRequestString = "StringForTheCallToTheAPIThatINeedGoesHere";
            ClientRequestBytes = Encoding.UTF8.GetBytes(ClientRequestString);
        }
    }
}