C# 将TCP StreamReader/StreamWriter转换为SSLStream
这是我的密码:C# 将TCP StreamReader/StreamWriter转换为SSLStream,c#,ssl,unity3d,C#,Ssl,Unity3d,这是我的密码: public class ServerClient { public TcpClient tcp; public StreamReader streamReader; public StreamWriter streamWriter; public int accountId; public int connectionId; public ServerClient(TcpClient clientSocket) {
public class ServerClient
{
public TcpClient tcp;
public StreamReader streamReader;
public StreamWriter streamWriter;
public int accountId;
public int connectionId;
public ServerClient(TcpClient clientSocket)
{
tcp = clientSocket;
streamReader = new StreamReader(tcp.GetStream(), false);
streamWriter = new StreamWriter(tcp.GetStream());
clientSocket.NoDelay = true;
}
}
下面是我监听数据的方式,在while循环中调用:
// Check for message from Client.
NetworkStream s = c.tcp.GetStream();
if (s.DataAvailable)
{
string data = c.streamReader.ReadLine();
if (data != null)
{
if (ValidateJSON(data))
{
OnIncomingData(c, data);
}
}
}
//continue;
以下是我如何检查客户端是否仍处于连接状态:
private bool IsConnected(TcpClient c)
{
try
{
if (c != null && c.Client != null && c.Client.Connected)
{
if (c.Client.Poll(0, SelectMode.SelectRead))
{
return !(c.Client.Receive(new byte[1], SocketFlags.Peek) == 0);
}
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
以下是我如何将数据发送到流中:
string JSonData = JsonConvert.SerializeObject(SendData);
c.streamWriter.WriteLine(JSonData);
c.streamWriter.Flush();
以下是我的客户端如何侦听消息:
public void ConnectToWorldServer()
{
if (socketReady)
{
return;
}
//Default host and port values;
string host = "127.0.0.1";
int port = 8080;
//ClientLoginServer ClientLoginServer = new ClientLoginServer();
try
{
socket = new TcpClient(host, port);
stream = socket.GetStream();
socket.NoDelay = true;
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
socketReady = true;
//Preserve the connection to worldserver thrue scenes
UnityThread.executeInUpdate(() =>
{
DontDestroyOnLoad(worldserverConnection);
});
// Start listening for connections.
while (true)
{
keepReading = true;
while (keepReading)
{
keepReading = true;
if (socketReady)
{
if (stream.DataAvailable)
{
string data = reader.ReadLine();
if (data != null)
{
UnityThread.executeInUpdate(() =>
{
OnIncomingData(data);
});
}
}
}
System.Threading.Thread.Sleep(1);
}
System.Threading.Thread.Sleep(1);
}
}
catch (Exception e)
{
Debug.Log("Socket error : " + e.Message);
}
}
我有关于SSL流的红色消息。以下是我的发现:
我有几个问题:
makecert
可以工作,但默认情况下它不受信任,因此您需要向消费者提供自定义的RemoteCertificateValidationCallback
,或者使用受信任的证书;在那里可能有用SslStream
需要介于NetworkStream
和StreamReader
之间;坦白地说,StreamReader
在这里能给你带来什么并不清楚——你可以在这里用Streaam
API做任何事情;因此,您不必使用WriteLine
,而是手动编码,然后写入编码的缓冲区;但是,没有理由,你不能在两个
Stream stream = // connect (get a NetworkStream)
if (config.Ssl) {
var ssl = new SslStream(stream, ... cert check callbacks, etc ...);
ssl.AuthenticateAsClient(expectedHost, allowedSslProtocols);
stream = ssl;
}
因此,如果您有类似的东西,您只需确保在将
网络流
包装到SslStream
中后附加任何流阅读器
/流编写器
。但是,我想你可以在这里删除StreamReader
/StreamWriter
,而不会给我带来太多不便。对我来说,试试。。抓住。。。return false
是一种非常奇怪的“异常处理”方法。您能告诉我如何在SslStream中包装NetworkStream吗?所以你认为没有必要使用NetwrokStream。最好只使用SslStream,对吗?@TonyStark“你能告诉我如何在SslStream中包装NetworkStream吗”-点击刷新:)@TonyStark“所以你认为不需要NetworkStream”-我根本没有说-NetworkStream
是使用SslStream
的关键组件,因为SslStream
需要一个流
,而网络流
使套接字
看起来像流
谢谢@Marc grade。我不太清楚。我从未使用过Ssl蒸汽。如果我删除StreamReader/streamwriter
我将如何从流中发送和读取消息?@TonyStarkstream.read(…)
和stream.Write(…)
-但是;无聊的。。。您现有的StreamReader
/StreamWriter
代码应该很好。。。如果你不熟悉那一部分,也许就别管它了