C#tcpclient没有写入套接字…或者我';我没有阅读所有的回复?

C#tcpclient没有写入套接字…或者我';我没有阅读所有的回复?,c#,tcpclient,C#,Tcpclient,我正试图编写一个C#控制台应用程序来与。我设法在powershell中实现了这一点,但我的C#代码不起作用 static void Main(string[] args) { byte[] ReadBuffer = new byte[1024]; string[] stringSeparators = new string[]{"READY"}; try { TcpClient Socket = new TcpClient(&

我正试图编写一个C#控制台应用程序来与。我设法在powershell中实现了这一点,但我的C#代码不起作用

static void Main(string[] args)
{
    byte[] ReadBuffer = new byte[1024];
    string[] stringSeparators = new string[]{"READY"};

    try
    {
        TcpClient Socket = new TcpClient("myServer", 8320);

        if (Socket.Connected) {
            NetworkStream netStream = Socket.GetStream();
            string PCMSResponse = "";

            // Check for the READY prompt
            if (netStream.CanRead) {
                int byteRead = 0;
                while (netStream.DataAvailable) {
                    byteRead = netStream.Read(ReadBuffer, 0, ReadBuffer.Length);
                    PCMSResponse += Encoding.ASCII.GetString(ReadBuffer, 0 , byteRead).Trim();
                }
            } else {
                Console.WriteLine("Cannot read from myServer");
            }
            Thread.Sleep(1000);

            // Get New Trip
            if (netStream.CanWrite) {
                Byte[] PCMSCommandBuffer = Encoding.ASCII.GetBytes("PCMSNewTrip");
                netStream.Write(PCMSCommandBuffer, 0 , PCMSCommandBuffer.Length);
                Thread.Sleep(1000);
            } else {
                Console.WriteLine("Cannot write to myServer.");
            }
            if (netStream.CanRead) {
                int byteRead = 0;
                while (netStream.DataAvailable) {
                    byteRead = netStream.Read(ReadBuffer, 0, ReadBuffer.Length);
                    PCMSResponse += Encoding.ASCII.GetString(ReadBuffer, 0, byteRead).Trim();
                }
            } else {
                Console.WriteLine("Cannot read from myServer");
            }
            string[] ResponseArray = PCMSResponse.Split(stringSeparators, StringSplitOptions.None);
            int c = ResponseArray.Length - 2;
            string TripID = ResponseArray[c].Replace(System.Environment.NewLine, "").Replace("\0", "");
            Console.WriteLine(PCMSResponse);
        }
    }
    catch (SocketException)
    {
        Console.WriteLine("Unable to connect to server")
    }
}
预期产量

ALK PCMILER SERVER READY
pcmsnewtrip
53
READY
实际产量

ALK PCMILER SERVER READY
似乎我并没有真正向服务器写入命令,因为如果我向服务器写入无效命令,我会看到如下错误:

ALK PCMILER SERVER READY
pmctripnew
NO SUCH FUNCTION
READY
我知道我可以写入套接字,因为我没有收到错误消息
无法写入myServer。

不知道我做错了什么(

如果您还想查看powershell代码,请告诉我


编辑-如果你要编辑这篇文章,至少要保持预期的输出如预期的那样!更改预期的输出会改变文章的意图。(例如,如果我想要苹果,但你编辑我的文章是为了要桔子,我不会得到正确的答案。)

因此,问题是
NetworkStream.Write
方法没有用行结束符结束字符串。因此,当我将
PCMSCommandBuffer
字节写入流时,服务器从未处理过该命令(因为它正在等待更多的命令或enter键让它知道您已完成)。我的解决方案是将流分配给
StreamWriter
。然后我可以使用
WriteLine
方法发送行终止符

streamWriter = new StreamWriter(netStream);
// Get New Trip
if (netStream.CanWrite) {
    Byte[] PCMSCommandBuffer = Encoding.ASCII.GetBytes("PCMSNewTrip");
    //netStream.Write(PCMSCommandBuffer, 0 , PCMSCommandBuffer.Length);
    streamWriter.WriteLine("PCMSNewTrip");
    //netStream.Flush();
    streamWriter.Flush();
    Console.WriteLine(PCMSCommandBuffer.Length + " PCMSNewTrip");
    Thread.Sleep(1000);
} else {
    Console.WriteLine("Cannot write to EW-APP1.");
}

netStream.DataAvailable
无法展望未来(除非您有时间机器)。它只能指示当前是否有可用数据(数据在与网络堆栈相关的接收缓冲区中可用),但它无法判断在下一个微/毫秒内是否有更多数据传入。您必须继续尝试从连接读取数据,直到您确定已收到所有预期数据,或者确定发生了问题(例如,等待/希望传入数据花费了太多时间)。如果发送大小可变的数据,最好让发送方/方先告诉接收方/方要接收的数据的大小,这样接收方就可以知道希望从连接/网络流读取多少数据。此外,您可能需要调用
netstream.Flush()
在你的
netstream.Write(…)
@FrankAlvaro,不,因为NetworkStream.Flush()是一个NOP…啊,看那里-很好的捕获@elgonzo;