0

ソケットで値を送信しようとしています。そのため、プロジェクト 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)
            {
                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();
        }

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

ストリームの終わりを超えて読み取ることができません

なんで ?

4

1 に答える 1

2

リスナーのメソッドを次のように書き直します。注意: これはテストされていないコードです。

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

編集:詳しく調べてみると、いくつかのことに気づきました。これを試して:

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();
于 2014-06-27T15:11:08.123 に答える