1

ソケットで値を送信しようとしています。そのため、プロジェクト Client と server に 2 つの部分があります。

クライアントは、次のコードを使用してサーバーに値を送信します。

  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)
            {

                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();

                    }
            }
         }

したがって、クライアントが値を送信すると、初めてサーバー部分で値を取得できます。クライアントがサーバーに別の値を送信すると、次のエラーが発生しました。

Stream was not readable.

なんで ?

4

2 に答える 2

5

ストリームを閉じているループでリーダーを閉じています。最も簡単な修正は、次のいずれかです。

  • リーダーをループの外に移動する、または
  • リーダーをまったく使用しないでください (ストリームと話すだけです)

ただし、ループ内でリーダーを使用する必要new BinaryReader(Stream, Encoding, bool)がある場合は、コンストラクターのオーバーロードを使用trueし、最後のパラメーターを渡して、基になる を閉じないように指示できますStream。デフォルトでは、リーダーがStream; leaveOpenパラメータはこの動作を変更します。

于 2014-06-27T14:40:36.227 に答える
2

これは、BinaryReader がストリームを所有していると想定し、それを使用するとストリームを閉じるために発生します。4.5 を使用している場合は、このオーバーロードを使用できますhttp://msdn.microsoft.com/en-us/library/gg712804(v=vs.110).aspx

このように表示されるはずです。

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();
            }
        }   
    }
}
于 2014-06-27T14:41:42.783 に答える