C# 侦听同一流(TCPClient/SSLStream)上的其他请求?

C# 侦听同一流(TCPClient/SSLStream)上的其他请求?,c#,tcpclient,sslstream,C#,Tcpclient,Sslstream,因此,我有一个客户机-服务器模型,基于使用TCPClient的流并将其转换为SSLStream以实现安全目的,但每次客户机希望向服务器发送新的内容时,它都会在服务器结束连接时打开到服务器的新TCP连接。我将如何监听来自同一流的其他请求?不知道如何,这就是为什么我要在最后杀死这条小溪。对不起,如果它是混乱的,我可以修改,如果不理解。谢谢 public void ServerListen() { TCPListener Server = new TCPListener(IPAddress.Any,

因此,我有一个客户机-服务器模型,基于使用TCPClient的流并将其转换为SSLStream以实现安全目的,但每次客户机希望向服务器发送新的内容时,它都会在服务器结束连接时打开到服务器的新TCP连接。我将如何监听来自同一流的其他请求?不知道如何,这就是为什么我要在最后杀死这条小溪。对不起,如果它是混乱的,我可以修改,如果不理解。谢谢

public void ServerListen()
{
TCPListener Server = new TCPListener(IPAddress.Any, 8001);
while (true)
{
Server.Start();
TCPClient TempClient = Server.AcceptTCPClient();
HandleRequest NewRequest = new HandleRequest(TempClient); // Send to a data handler class and open a separate thread to allow for additional clients to connect
}
}


public class HandleRequest
{

TCPClient WorkingClient;
public HandleRequest(TCPClient TempClient)
{
WorkingClient = TempClient;
(new Thread(new ThreadStart(DoWork))).Start();
}

public static void DoWork()
{
// Do Something Here With Data From Client
ProvideResponse(SomeData);
}

public static void ProvideResponse(object Data)
{
SSLStream SecureStream = new SSLStream(WorkingClient, false); // Kill inner stream after creating a secure connection
SecureStream.AuthenticateAsServer(MyCertificate, false, SslProtocols.Tls, true);
XmlSerializer XS = new XMLSerializer(typeof(someclass));
someclass TempObject = new someclass(){ InnerData = Data};
if (SecureStream.CanWrite)
{
XS.Serialize(SecureStream, TempObject);
}
SecureStream.Close();
}

}

SslStream
只需环绕另一个
。如果调用
authenticatesServer()
另一端应该
authenticatesClient()
,从那时起,您可以通过SSL进行通信。如果任何一方未能调用此方法,
SslStream
将抛出异常

如果关闭用
leaveInnerStreamOpen
参数设置为
true
构建的
SslStream
,则可以直接通过基础流进行通信,就像从来没有
SslStream
(当
SslStream
仍然打开时,您甚至可以直接向底层流发送和接收数据)

在HTTPS这样的典型场景中,客户机和服务器会在连接建立后立即启用SSL,并在连接期间继续使用SSL。在请求/响应后关闭两侧的
SslStream
,然后为下一条消息重新创建一条,这并不会阻止您——您只需要o保持客户端和服务器之间的“ssl状态”同步

关于你的评论:

TCP连接建立后,只要双方保持连接,您就可以发送和接收数据。例如:

TcpClient client = TcpListener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
while (true)
{
    int bytes = stream.Read(...);
    if (bytes == 0) 
    {
        // other side has disconnected
        stream.Close();
        break;
    }

    // add incoming data to buffer, process messages
    ...
}
这就像是在一张纸上写下你展示给另一个人的文字,然后和另一个人交谈——你只需继续在同一张纸上写,另一方就可以边写边读

如果您在请求/响应后关闭
TcpClient
,然后使用
TcpListener.AcceptXxx()
打开一个新的客户端,那么您就在每条消息后扔掉了每一张纸


如果我是你,我会玩这些概念(使用
NetworkStream
类)没有
SslStream
包装器,直到您感觉自己做了正确的事情。可以添加
SslStream
层,而无需对使用
NetworkStream
的代码进行任何重大更改。实际上,我发现这非常有帮助。因此,一旦我设置了ssstream并进行了身份验证,就可以打开内部流,TCPClient将无法运行当使用底层SSL连接时?如果是这种情况,在“ProviderResponse”方法完成后,我将如何侦听来自TCPClient的其他请求?您将使用
NetworkStream=myTCPClient.GetStream()
,两者都未加密地通过该流进行通信,并从中创建
SslStream
。很抱歉,可能我说错了。我可以创建SslStream(请参阅提供响应),但一旦我这样做,并完成我需要的工作(发送响应),如何通过TCPClient接受进一步的请求?它是否类似于TCPListener
While(WorkingClient.Connect){//do work}
?给我留下了一些关于XMLSerializer使用的问题,但这可能是一个完全不同的问题,我认为您已经恰当地回答了我实际提出的问题,或者至少给了我一些很好的指导和见解。非常感谢。