C# 使用readbinary时导致无法读取超过流结尾的内容
我试图通过套接字发送一个值,所以我的项目客户端和服务器中有两个部分 客户端使用以下代码向服务器发送值:C# 使用readbinary时导致无法读取超过流结尾的内容,c#,sockets,binaryreader,binarywriter,C#,Sockets,Binaryreader,Binarywriter,我试图通过套接字发送一个值,所以我的项目客户端和服务器中有两个部分 客户端使用以下代码向服务器发送值: NetworkStream networkStream = socketForServer.GetStream(); System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(networkStream); //------
NetworkStream networkStream = socketForServer.GetStream();
System.IO.BinaryWriter binaryWriter =
new System.IO.BinaryWriter(networkStream);
//------
int messageSource = 0;
int messageDesitination = 0;
int interlockingId = 0;
int trackId = 0;
int trainId = 2;
int direction = 0;
int messageType = 0;
int informationType = 0;
int dateTime = 0;
foreach (Sensor LeftSensorList in LeftSensor)
{
binaryWriter.Write(messageSource);
binaryWriter.Write(messageDesitination);
binaryWriter.Write(interlockingId);
binaryWriter.Write(trackId);
binaryWriter.Write(trainId);
binaryWriter.Write(direction);
binaryWriter.Write(messageType);
binaryWriter.Write(informationType);
binaryWriter.Write(dateTime);
binaryWriter.Flush();
binaryWriter.Close();
Thread.Sleep(4000);
}
在服务器部分,我应该读取二进制值:
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
Console.WriteLine("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
NetworkStream networkStream = new NetworkStream(socketForClient);
while (true)
{
TimeTableRepository objTimeTableRepository = new TimeTableRepository();
SensorRepository objSensorRepository = new SensorRepository();
ArrivalTimeRepository objArrivalTimeRepository=new ArrivalTimeRepository();
TrainRepository objTrainRepository = new TrainRepository();
using (var reader = new BinaryReader(networkStream, Encoding.Default, true))
{
int messageSource = reader.ReadInt32();
int messageDesitination = reader.ReadInt32();
int interlockingId = reader.ReadInt32();
int trackId = reader.ReadInt32();
int trainId = reader.ReadInt32();
int direction = reader.ReadInt32();
int messageType =reader.ReadInt32();
int informationType = reader.ReadInt32();
int dateTime = reader.ReadInt32();
}
}
networkStream.Close();
}
socketForClient.Close();
Console.WriteLine("Press any key to exit from server program");
Console.ReadKey();
}
因此,当客户端发送一个值时,我可以第一次在服务器部分获取该值,当客户端向我的服务器发送另一个值时,我得到以下错误:
无法读取流结尾以外的内容
为什么?我将重写listener方法,使其看起来像这样。 注意:这是未经测试的代码
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
using (var reader = new BinaryReader(new NetworkStream(socketForClient), Encoding.Default, true))
{
while (((int)reader.PeekChar()) != -1)
{
List<int> variables = new List<int>();
int messageSource = reader.ReadInt32();
int messageDesitination = reader.ReadInt32();
int interlockingId = reader.ReadInt32();
int trackId = reader.ReadInt32();
int trainId = reader.ReadInt32();
int direction = reader.ReadInt32();
int messageType =reader.ReadInt32();
int informationType = reader.ReadInt32();
int dateTime = reader.ReadInt32();
}
}
}
我更改了它,但当我的客户端尝试连接到服务器时,它无法显示此错误:按任意键退出服务器程序---请查看更新,我更新了帖子,然后我根据我看到的内容编写了整个侦听器方法,似乎问题在于您使用了一个糟糕的机制来实现您想要的内容。你应该重新设计并看看这个,所以我在我的应用程序中使用了一个线程,那么这两种方法之间有什么不同呢?我是说我的方法和msdn方法你的方法是这样的。我说得对吗?@EA yes;但是,我希望您在进行编辑之前尝试我的编辑,因为我认为这会更简单。
NetworkStream networkStream = socketForServer.GetStream();
System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(networkStream);
//------
int messageSource = 0;
int messageDesitination = 0;
int interlockingId = 0;
int trackId = 0;
int trainId = 2;
int direction = 0;
int messageType = 0;
int informationType = 0;
int dateTime = 0;
foreach (Sensor LeftSensorList in LeftSensor)
{
binaryWriter.Write(messageSource);
binaryWriter.Write(messageDesitination);
binaryWriter.Write(interlockingId);
binaryWriter.Write(trackId);
binaryWriter.Write(trainId);
binaryWriter.Write(direction);
binaryWriter.Write(messageType);
binaryWriter.Write(informationType);
binaryWriter.Write(dateTime);
binaryWriter.Flush();
Thread.Sleep(4000);
}
//Hint : Changes here
binaryWriter.Close();