发送服务器多条消息? 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”,它是由服务器就好了好评。只有当我试图发送名为“文本”的字符串时,问题才会出现!
任何帮助将不胜感激 - 我不是那么熟悉的插座,因此,我一直在试图与现在明白这一点了一段
答
你已经有了一个大问题就在这里挣扎 - 没有什么可以指定一条消息的结束和另一条消息的开始。服务器很可能会一次收到两条消息,或者一条消息,然后是另一条消息。
避免这种情况的最简单方法是在每个消息前加上其中的字节数,例如,作为固定的四字节格式。因此,要发送消息,你会:
- 从字符串字节编码它(最好使用UTF-8,而不是ASCII除非你确信你将永远不会需要任何非ASCII文本)
- 写出字节数组的长度为四字节的值
- 写出内容
在服务器上:
-
个
- 读四个字节(循环如有必要 - 有没有保证,你甚至会阅读这些四个字节在一起,虽然你几乎肯定会)
- 转换的四个字节转换成整数
- 分配该大小 的字节数组
- 循环轮,从“当前位置”到缓冲区的末尾读,直到你填写的缓冲区
- 转换缓冲成一个字符串
另一种方法就是使用BinaryReader
和BinaryWriter
- ReadString
和WriteString
使用长度前缀,当然,以一种稍微不同的形式。
另一种选择,你可能使用是有一个分隔符(如回车),但是这意味着你将需要添加转义如果你需要在将文本分隔符。
你能给我们多一点服务器端代码吗? –
另外,你可以发布哪一行代码抛出异常? – wllmsaccnt
没有任何迹象表明你在'OptionOneInsert'之后向服务器发送任何东西 - 你没有使用* clientStream2'。 –