发送服务器多条消息? C#

问题描述:

我有一个快速和肮脏的问题。因此,我有两个客户端和一个服务器运行。我可以毫无问题地将来自客户端的消息传达给服务器。当我想从客户端读取两条消息时出现问题 - 而不仅仅是一条消息。发送服务器多条消息? C#

我收到的错误是:IOException未处理。无法从传输连接读取数据:现有连接被远程主机强制关闭。

这是我在服务器端代码:

私有静态无效HandleClientComm(对象客户端) { /**创建包含DatabaseFile对象**/ 名单theDatabase =新名单()的列表;

 TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] message = new byte[4096]; 
     int bytesRead; 

     do 
     { 
      bytesRead = 0; 

      try 
      { 
       // Blocks until a client sends a message      
       bytesRead = clientStream.Read(message, 0, 4096); 
      } 
      catch (Exception) 
      { 
       // A socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       // The client has disconnected from the server 
       break; 
      } 

      // Message has successfully been received 
      ASCIIEncoding encoder = new ASCIIEncoding(); 

      Console.WriteLine("To: " + tcpClient.Client.LocalEndPoint); 
      Console.WriteLine("From: " + tcpClient.Client.RemoteEndPoint); 
      Console.WriteLine(encoder.GetString(message, 0, bytesRead)); 


      if (encoder.GetString(message, 0, bytesRead) == "OptionOneInsert") 
      { 
       byte[] message2 = new byte[4096]; 
       int bytesRead2 = 0; 

       **bytesRead2 = clientStream.Read(message, 0, 4096);** //ERROR occurs here! 

       Console.WriteLine("Attempting to go inside insert)"); 
       Menu.Insert(theDatabase, bytesRead2); 
      } 

这里是我的客户端代码:

 ASCIIEncoding encoder = new ASCIIEncoding(); 
     byte[] buffer = encoder.GetBytes("OptionOneInsert"); 

     Console.ReadLine(); 
     clientStream.Write(buffer, 0, buffer.Length); 
     clientStream.Flush(); 

     NetworkStream clientStream2 = client.GetStream(); 
     String text = System.IO.File.ReadAllText("FirstNames.txt"); 
     clientStream2.Write(buffer, 0, buffer.Length); 
     clientStream2.Flush(); 
     ASCIIEncoding encoder2 = new ASCIIEncoding(); 

     byte[] buffer2 = encoder2.GetBytes(text); 
     Console.WriteLine("buffer is filled with content"); 
     Console.ReadLine(); 

当客户端发送消息“optionOne”,它是由服务器就好了好评。只有当我试图发送名为“文本”的字符串时,问题才会出现!

任何帮助将不胜感激 - 我不是那么熟悉的插座,因此,我一直在试图与现在明白这一点了一段

+0

你能给我们多一点服务器端代码吗? –

+0

另外,你可以发布哪一行代码抛出异常? – wllmsaccnt

+1

没有任何迹象表明你在'OptionOneInsert'之后向服务器发送任何东西 - 你没有使用* clientStream2'。 –

你已经有了一个问题就在这里挣扎 - 没有什么可以指定一条消息的结束和另一条消息的开始。服务器很可能会一次收到两条消息,或者一条消息,然后是另一条消息。

避免这种情况的最简单方法是在每个消息前加上其中的字节数,例如,作为固定的四字节格式。因此,要发送消息,你会:

  • 从字符串字节编码它(最好使用UTF-8,而不是ASCII除非你确信你将永远不会需要任何非ASCII文本)
  • 写出字节数组的长度为四字节的值
  • 写出内容

在服务器上:

  • 读四个字节(循环如有必要 - 有没有保证,你甚至会阅读这些四个字节在一起,虽然你几乎肯定会)
  • 转换的四个字节转换成整数
  • 分配该大小
  • 的字节数组
  • 循环轮,从“当前位置”到缓冲区的末尾读,直到你填写的缓冲区
  • 转换缓冲成一个字符串

另一种方法就是使用BinaryReaderBinaryWriter - ReadStringWriteString使用长度前缀,当然,以一种稍微不同的形式。

另一种选择,你可能使用是有一个分隔符(如回车),但是这意味着你将需要添加转义如果你需要在将文本分隔符。

+0

我看,好的,这是有帮助的。我让我的程序停止崩溃。但正如你所表示的那样,第二条消息还没有完全收到。非常感谢你的回复! – BigBug

+0

我不认为我会再次尝试回答一个C#问题。与你的相比,我的矿难将不完全 –

+0

@Bojan Kogoj:根本不用担心。我真诚感谢任何帮助。 C#没问题。有很多不同的方法来做不同的事情。所以,我希望你仍然愿意帮助别人:o) – BigBug