所以我有一个客户端服务器模型,它基于使用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();
}
}
答案 0 :(得分:1)
SslStream
只是绕着另一个Stream
。如果您致电AuthenticateAsServer()
,则另一方应AuthenticateAsClient()
,从那时起,您就可以通过SSL进行通信。如果任何一方都未能调用此方法,则SslStream
将抛出异常。
如果您关闭SslStream
参数设置为leaveInnerStreamOpen
而构建的true
,则可以直接通过基础流进行通信,就好像从未有SslStream
一样(您甚至可以直接发送和接收基础流,而 SslStream
仍处于打开状态。)
在HTTPS等典型场景中,客户端和服务器会在建立连接后立即启用SSL,并在连接期间继续使用SSL。在请求/响应之后关闭双方的SslStream
并为下一条消息重新创建一条消息时,没有什么可以阻止你 - 你只需要在客户端和服务器之间保持“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
的代码进行任何重大更改。