C#-TCP客户端只接收第一个数据包

C#-TCP客户端只接收第一个数据包,c#,tcpclient,C#,Tcpclient,我正在开发一个c#程序,只是为了了解一些关于TcpClient的知识。因此,这个程序从另一个程序接收一条消息,并向它发回一个OK数据包,确认已建立的连接 在第一个请求中,它工作得很好,没有任何问题地发回OK数据包。但在第二次请求时,它根本没有答复。看起来它从未从客户端收到数据包。我可以使用数据包嗅探器看到数据包是从客户端发送的,但我的服务器没有任何动作 它实际上是在控制台上打印所有请求,所以我可以查看是否有东西“进入”了readstream。如果我关闭服务器或客户端,然后重新打开以建立新连接,我

我正在开发一个c#程序,只是为了了解一些关于TcpClient的知识。因此,这个程序从另一个程序接收一条消息,并向它发回一个OK数据包,确认已建立的连接

在第一个请求中,它工作得很好,没有任何问题地发回OK数据包。但在第二次请求时,它根本没有答复。看起来它从未从客户端收到数据包。我可以使用数据包嗅探器看到数据包是从客户端发送的,但我的服务器没有任何动作

它实际上是在控制台上打印所有请求,所以我可以查看是否有东西“进入”了readstream。如果我关闭服务器或客户端,然后重新打开以建立新连接,我会再次收到第一个数据包,但不会收到第二个数据包

我一直在寻找解决办法,至少一周了。许多功能对我来说根本不起作用,我不想让应用程序多次断开和重新连接

我的服务器代码:

static void Main(string[] args)
{
    int InternalLoop = 0;
    bool Finished = false;
    TcpListener serverSocket = new TcpListener(System.Net.IPAddress.Any, 10000);
    int requestCount = 0;
    TcpClient clientSocket = default(TcpClient);
    serverSocket.Start();
    while (true)
    {
        bool LoopReceive = true;
        bool LoopSend = false;

        Console.WriteLine(" :::: SERVER STARTED OK");
        clientSocket = serverSocket.AcceptTcpClient();
        Console.WriteLine(" :::: CONNECTED TO CLIENT");
        requestCount = 0;
        NetworkStream networkStream = clientSocket.GetStream();

        string Packettosend = "";

        while (LoopReceive == true)
        {
            try
            {
                //Gets the Client Packet
                requestCount = requestCount + 1;
                byte[] bytesFrom = new byte[128];
                networkStream.Read(bytesFrom, 0, bytesFrom.Length);
                string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);

                Packettosend = "ALIVE";
                Console.WriteLine(" ::: SENDING ALIVE PACKET");
                LoopReceive = false;
                LoopSend = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        while (LoopSend == true || InternalLoop < 2)
        {
            try
            {
                InternalLoop += 1;
                if (Packettosend == "ALIVE")
                {
                    Byte[] sendBytes1 = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
                    networkStream.Write(sendBytes1, 0, sendBytes1.Length);
                    networkStream.Flush();

                    LoopReceive = true;
                    LoopSend = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}
static void Main(字符串[]args)
{
int InternalLoop=0;
bool Finished=false;
TcpListener serverSocket=新的TcpListener(System.Net.IPAddress.Any,10000);
int requestCount=0;
TcpClient clientSocket=默认值(TcpClient);
serverSocket.Start();
while(true)
{
bool-LoopReceive=true;
bool LoopSend=false;
WriteLine(“::服务器启动正常”);
clientSocket=serverSocket.AcceptTcpClient();
Console.WriteLine(“::连接到客户端”);
requestCount=0;
NetworkStream NetworkStream=clientSocket.GetStream();
字符串Packettosend=“”;
while(LoopReceive==true)
{
尝试
{
//获取客户端数据包
requestCount=requestCount+1;
byte[]bytesFrom=新字节[128];
networkStream.Read(bytesFrom,0,bytesFrom.Length);
string dataFromClient=System.Text.Encoding.ASCII.GetString(bytesFrom);
Packettosend=“活动”;
Console.WriteLine(“::发送活动数据包”);
LoopReceive=false;
LoopSend=true;
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
}
while(LoopSend==true | | InternalLoop<2)
{
尝试
{
内环+=1;
如果(Packettosend==“活动”)
{
字节[]sendBytes1={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
networkStream.Write(sendBytes1,0,sendBytes1.Length);
networkStream.Flush();
LoopReceive=true;
LoopSend=false;
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
}
}
}

您没有收到第二个数据包的原因如下:

clientSocket = serverSocket.AcceptTcpClient();
此调用等待新客户端连接到服务器的侦听器套接字

将此行移到外部循环之外,以仅接受一个客户端,并在循环中仅使用单个
clientSocket


(我想添加详细信息,但我正在路上,很难在手机上键入所有信息…

您没有收到第二个数据包的原因是这一行:

clientSocket = serverSocket.AcceptTcpClient();
此调用等待新客户端连接到服务器的侦听器套接字

将此行移到外部循环之外,以仅接受一个客户端,并在循环中仅使用单个
clientSocket


(我想添加详细信息,但我正在路上,很难在手机上键入所有这些信息…

在您所处的级别上没有数据包,只有流。假设您正在将数据写入磁盘,将文件复制到另一台计算机并读取它。你怎么知道第一台计算机在第一次写调用中写了多少呢?
Read
的返回值至关重要。这是知道缓冲区中实际有多少数据的唯一方法。为什么是这两个循环?你只需要写一个读的响应,你只需要一个循环。Luaan,谢谢你关于双循环的提示。我把它修好了,看起来还可以。卢安,谢谢你关于双圈的建议。我修好了,看起来还不错。关于阅读的回归,你是什么意思?我真的是从Tcp开始的,没有理解你的意思。使用
AcceptTcpClient
可以等待新客户端连接。仅在外部循环外执行此操作。顺便说一句,while(x==true)与while(x)相同。您所在的级别上没有数据包,只有流。假设您正在将数据写入磁盘,将文件复制到另一台计算机并读取它。你怎么知道第一台计算机在第一次写调用中写了多少呢?
Read
的返回值至关重要。这是知道缓冲区中实际有多少数据的唯一方法。为什么是这两个循环?你只需要写一个读的响应,你只需要一个循环。Luaan,谢谢你关于双循环的提示。我把它修好了,看起来还可以。卢安,谢谢你关于双圈的建议。我修好了,看起来还不错。关于阅读的回归,你是什么意思?我真的是从Tcp开始的,没有理解你的意思。使用
AcceptTcpClient
可以等待新客户端连接。仅在外部循环外执行此操作。顺便说一句,while(x==true)与while(x)相同。勒内,我做了你所说的更改,效果很好。但现在我在考虑如何用这种方式同时处理多个连接。我的意思是,如果有两个客户端连接到我的服务器。MarkJohansen是的,但这个问题太宽泛了,在评论中无法回答。Stack overflow是一个问答网站,所以如果你有一个新的(最好是具体的)问题,请打开一个新的问题