监听同一流上的其他请求 (TCPClient/SSLStream)?
Listen for additional requests on the same stream (TCPClient/SSLStream)?
所以我有一个基于使用 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
简单地环绕另一个 Stream
。如果您调用 AuthenticateAsServer()
,另一方应该 AuthenticateAsClient()
,从那时起您可以通过 SSL 进行通信。如果任何一方调用此方法失败,SslStream
将抛出异常。
如果关闭 leaveInnerStreamOpen
参数设置为 true
构造的 SslStream
,则可以直接通过底层流进行通信,就好像从来没有 SslStream
](您甚至可以直接发送和接收 to/from 底层流 而 SslStream
仍然打开)。
在像 HTTPS 这样的典型场景中,客户端和服务器会在连接建立后立即启用 SSL,并在连接期间继续使用它。没有什么能阻止你在 request/response 之后关闭两侧的 SslStream
,并为下一条消息重新创建一个 - 你只需要保持客户端和服务器之间的 "ssl state" 同步.
至于你的评论:
建立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
...
}
这就像通过在一张纸上写文字给对方看来与某人交谈 - 您只需继续在同一张纸上书写,另一面可以在您书写的同时阅读。
如果您在 request/response 之后关闭 TcpClient
并使用 TcpListener.AcceptXxx()
打开一个新的 TcpClient
,您将在收到每条消息后丢弃每一张纸。
如果我是你,我会尝试这些概念(使用 NetworkStream
class) 没有 SslStream
包装器,直到你觉得你在做正确的事。可以添加 SslStream
层,而无需对使用 NetworkStream
.
的代码进行任何重大更改
所以我有一个基于使用 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
简单地环绕另一个 Stream
。如果您调用 AuthenticateAsServer()
,另一方应该 AuthenticateAsClient()
,从那时起您可以通过 SSL 进行通信。如果任何一方调用此方法失败,SslStream
将抛出异常。
如果关闭 leaveInnerStreamOpen
参数设置为 true
构造的 SslStream
,则可以直接通过底层流进行通信,就好像从来没有 SslStream
](您甚至可以直接发送和接收 to/from 底层流 而 SslStream
仍然打开)。
在像 HTTPS 这样的典型场景中,客户端和服务器会在连接建立后立即启用 SSL,并在连接期间继续使用它。没有什么能阻止你在 request/response 之后关闭两侧的 SslStream
,并为下一条消息重新创建一个 - 你只需要保持客户端和服务器之间的 "ssl state" 同步.
至于你的评论:
建立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
...
}
这就像通过在一张纸上写文字给对方看来与某人交谈 - 您只需继续在同一张纸上书写,另一面可以在您书写的同时阅读。
如果您在 request/response 之后关闭 TcpClient
并使用 TcpListener.AcceptXxx()
打开一个新的 TcpClient
,您将在收到每条消息后丢弃每一张纸。
如果我是你,我会尝试这些概念(使用 NetworkStream
class) 没有 SslStream
包装器,直到你觉得你在做正确的事。可以添加 SslStream
层,而无需对使用 NetworkStream
.