我正在开发一个在局域网中工作的加密聊天程序,它也应该能够发送文件。这里有一些问题: 1 - 对于聊天部分它只发送1条消息并关闭连接,另一方应该再次运行程序以便接收更多消息,我试着将它放在这样的循环中 (收到关闭并再次收到),但程序崩溃了,
接收文件时遇到同样的问题,
不知道怎样才能解决这个问题?
这是代码
IP = textBox2.Text.ToString();
int port = int.Parse(textBox1.Text);
IPAddress IP2 = IPAddress.Parse(IP);
TcpListener TCPListen = new TcpListener(IP2,port);
TCPListen.Start();
TcpClient TCP = TCPListen.AcceptTcpClient();
//bool a = false;
NetworkStream NetStream = TCP.GetStream();
//while (!a)
//{
RijndaelManaged RMCrypto = new RijndaelManaged();
byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
CryptoStream CryptStream = new CryptoStream(NetStream,
RMCrypto.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
StreamReader SReader = new StreamReader(CryptStream);
message = SReader.ReadToEnd();
textBox3.Clear();
textBox3.Text = message;
CryptStream.Flush();
SReader.Close();
//encryption(NetStream);
NetStream.Flush();
NetStream.Close();
TCPListen.Stop();
TCP.Close();
它就像一个循环 bool a = false; 虽然(!a)意味着继续这样做。
答案 0 :(得分:1)
首先,你要做到这一点要复杂得多。实际上没有必要直接处理套接字甚至TcpClient这样的事情了。使用WCF让客户端相互通信。这样做非常简单,你不必担心所有这些乏味。 WCF为您处理所有管道。
其次,如果您打算以您的方式执行此操作 - 您可以打开NetworkStream或SslStream并“读取”并“写入”该流以处理您的所有通信。最简单的方法是通过一个连接/流完成所有操作。这意味着你在传输文件时无法聊天。一旦你将另一个流带入图片,这又是另一个数量级更复杂的因素,因为除了主流之外,你现在必须管理该流的连接和生命周期。在我看来,这种方法可能非常脆弱 - 因为大多数代码都必须从问题中恢复。如果有人在您通信时重新启动路由器怎么办?如果您的文件发送失败会怎样?因为你在如此低的水平处理它,这将需要大量代码 - 只是优雅地失败。
同样,我会积极地使用WCF。希望有所帮助。