Отправка клиентской очереди данных на серверную сторону через Tcp / IP - PullRequest
1 голос
/ 23 июля 2011

Я хочу отправить данные с клиента на сервер.Есть две очереди.на стороне клиента и на стороне сервера.Я хочу, чтобы мой клиент был подключен к серверу и отправил все данные в очереди клиента на сервер.На стороне сервера я хочу принять всех клиентов и получить все объекты и добавить в очередь на стороне сервера

Код клиента:

Queue<Person> clientQueue;   // This is the client side queue

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
var client = new TcpClient();

while(!clientQueue.IsEmpty)
{
    Person personObj = clientQueue.Dequeue();

    client.Connect(serverEndPoint);
    NetworkStream clientStream = client.GetStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(clientStream, personObj);
    clientStream.Flush();
}

Сторона сервера:

Queue<Person> serverQueue;   // This is the server side queue

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
TcpListener tcpListener = new TcpListener(ipEndPoint);


while(true)
{
    TcpClient client = tcpListener.AcceptTcpClient();
    NetworkStream clientStream = tcpClient.GetStream();
    BinaryFormatter bf = new BinaryFormatter();
    Person person = (Person)bf.Deserialize(clientStream);
    tcpClient.Close();

    serverQueue.Enqueue(person);
}

Я знаю, выше код не работает.Я просто хочу набросать свой дизайн.Может кто-нибудь, пожалуйста, пришлите мне пример кода.Как отправить клиентскую очередь в очередь на сервер ..

Спасибо ..

Ответы [ 2 ]

4 голосов
/ 23 июля 2011
  1. Для очереди как на сервере, так и на стороне клиента вы должны использовать BlockingCollection, если вы используете .net 4.0, для более ранних версий используйте комбинацию Queue и AutoResetEvent.проверьте this .

  2. На стороне сервера вы должны использовать асинхронные методы или просто создать новый поток для обработки каждого нового клиента, а затем прочитать данные в этом потоке.как:

    TcpClient client = tcpListener.AcceptTcpClient();
    ThreadPool.QueueUserWorkItem(new WaitHandle(HandleCleint), client);
    
    private void HandleClient(object clientObject)
    {
        TcpClient client = (TcpClient)clientObject;
        NetworkStream clientStream = client.GetStream();
        //handle the data here
    }
    

Редактировать: Вы заявили в комментарии:

У меня нет идеи о том, какизменить мою программу, чтобы отправить всю очередь на стороне сервера

Массив или сама очередь является объектом:

//at your client side:
bf.Serialize(clientStream, persons);//assume persons is Queue<Person>

//at your server side:
Queue<Person> persons = (Queue<Person>)bf.Deserialize(clientStream);
2 голосов
/ 23 июля 2011

Хорошо.Наконец я нашел ответ на свой вопрос, проводя некоторые исследования / тестирование.Я опубликую это здесь для кого-то еще ..:)

На моей стороне клиента сначала я должен отправить, сколько байтов я собираюсь отправить на сервер.и затем отправьте эти данные .. Как это ..

Queue<Person> clientQueue;   // This is the client side queue

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
var client = new TcpClient();

NetworkStream clientStream = client.GetStream()

while (disconnectClient)
{
    if (clientQueue.Count > 0)
    {
         Person person = clientQueue.Dequeue();
         using (MemoryStream memoryStrem = new MemoryStream())
         {
              var bf = new BinaryFormatter();
              bf.Serialize(memoryStrem, person);

              byte[] writeData = memoryStrem.ToArray();


              byte[] writeDataLen = BitConverter.GetBytes((Int32)writeData.Length);
              clientStream.Write(writeDataLen, 0, 4);
              clientStream.Write(writeData, 0, writeData.Length);
         }
    }
}
clientStream.Dispose();
client.Dispose();

На стороне сервера:

Queue<Person> serverQueue;   // This is the server side queue

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15884);
TcpListener tcpListener = new TcpListener(ipEndPoint);
tcpListener.Start();

while(true)
{
    TcpClient tcpClient = tcpListener.AcceptTcpClient();
    NetworkStream clientStream = tcpClient.GetStream();

    while (client.Connected)
    {
        if (client.Available >= 4)
        {
            try
            {
                 byte[] readDataLen = new byte[4];
                 clientStream.Read(readDataLen, 0, 4);

                 Int32 dataLen = BitConverter.ToInt32(readDataLen, 0);
                 byte[] readData = new byte[dataLen];

                 clientStream.Read(readData, 0, dataLen);

                 using (var memoryStream = new MemoryStream())
                 {
                      memoryStream.Write(readData, 0, readData.Length);
                      memoryStream.Position = 0;    /// This is very important. It took 4 hrs to identify an error because of this :)

                      BinaryFormatter bf = new BinaryFormatter();
                      Person person = (Person)bf.Deserialize(memoryStream);

                      serverQueue.Enqueue(person);
                 }
            }
            catch { }
        }
    }
    tcpClient.Close();
}
...