I am trying to send a value by socket .So i have two parts in my project Client and server .
The client sends a value to server using this code :
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);
}
In server part i should read the binary values :
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
NetworkStream networkStream = new NetworkStream(socketForClient);
while (true)
{
List<int> variables = new List<int>();
using (var reader = new BinaryReader(networkStream))
{
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();
reader.Close();
}
}
}
So when the client send a value i can get the value in server part just for first time ,when a client sends another values to my server i got this error :
Stream was not readable.
Why ?
This is caused because BinaryReader assumes that it owns the stream and closes it when it uses it. If you're using 4.5 you can use this overload http://msdn.microsoft.com/en-us/library/gg712804(v=vs.110).aspx
It should look like this for you.
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
NetworkStream networkStream = new NetworkStream(socketForClient);
while (true)
{
List<int> variables = new List<int>();
//Hint : This Line
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();
reader.Close();
}
}
}
}