【发布时间】:2018-04-19 08:30:38
【问题描述】:
这是我的代码:
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 Stream 感到不满。这是我发现的:https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx
我有几个问题:
- 我需要像购买网站证书一样购买 SSL 证书吗?
- 我可以生成自签名 SSL 证书吗?如果是这样并且需要它,您能否向我展示如何实现这一目标的任何参考?
- 是否可以将此 SSL 流附加到我的 StreamReader/StreamWriter ?甚至需要它还是我必须重新制作整个连接/通信的东西?
- 创建 SSLStream 时,服务器和客户端之间的整个通信都将被加密,因此任何人都无法停留在两者之间并收听/理解他们正在通信的内容?
- 如果我必须将证书文件附加到客户端,以便它可以与服务器建立成功的 SSL 连接,然后将该客户端发送给所有必须使用该客户端的人,这不会危及客户端的安全性SSL 连接,因为我也向他们发送证书?
这就是我想问的。你能做的最好的事情是帮助我回答你的问题,如果可能的话,请输入我必须应用的代码更改,以使 StreamReader/StreamWriter 通过加密的 SSL 工作。
【问题讨论】:
-
对我来说,
try .. catch ... return false是一种非常奇怪的“异常处理”方式。