2010-05-27 3 views
1

Я пишу TCP-чат-сервер (язык программирования не машет). Это школьный проект для моего племянника, поэтому он не будет выпущен, и все вопросы, которые я задаю, - это только для моих знаний :). , Некоторые из вещей, которые он будет поддерживать:Просьба предложить другие способы связи между сервером и клиентом

  • чате между пользователями (DOH), он будет многопоточных
  • посылают друг другу файлы

Я знаю, что я мог бы легко уйти все вещи выше если я иду с сериализацией и просто отправляю объекты с клиента на сервер и обратно. Но, если я это сделаю, он будет ограничен конкретным языком программирования (это означает, что клиенты, написанные на других языках программирования, не смогут десериализовать объекты). Каким образом можно было бы поддерживать другие клиенты, написанные на других языках?

Один из способов пойти, с головы до головы, будет идти в этом направлении: сервер & клиент связывается, отправив сообщения & кусков (вместо других имен). Вот что я имею в виду:

  • каждый раз, когда клиент/сервер хочет послать что-нибудь (текстовое сообщение или файл) будет первым отправить простое текстовое сообщение (перевод строки прекращается) с числом кусков он будет Отправить. Пример:

    Команда 4,20,30,40,50

Где command бы нечто вроде instant-message или file, 4 будет количество порций, которые будут посланы, 20 будут иметь размер в байты первого блока, 30 второго и т. д.

  • после того, как сообщение было отправлено, клиент/сервер начнет отправлять куски (размеры указаны в отправленном сообщении).

Что вы думаете о реализации коммуникации клиент/сервер таким образом? Какие существуют лучшие варианты?

+1

TCP/IP over Avian Carrier, согласно RFC 1149: http://www.rfc-editor.org/rfc/rfc1149.txt – Oded

ответ

4

Что вы говорите о сериализации, неверно. Вы можете использовать межплатформенный протокол сериализации, например protocol buffers. Это упростит вашу жизнь и избавит вас от реализации вашего собственного протокола связи. По моему мнению, будет лучше найти существующий протокол и реализовать его вместо того, чтобы пытаться сделать свой собственный. Нечто такое же просто, как xmodem.

Кроме того, чтобы клиентское программное обеспечение не работало как с сервером, а как с клиентом (что означает необходимость решения проблем с идентификатором одноранговой сети), вы могли бы всем клиентам общаться через централизованный сервер.

1

Звучит неплохо, в основном вам нужно определить заголовок сообщения (как вы это сделали), чтобы получатель знал, сколько байтов должно быть прочитано для каждого сообщения.

Я предлагаю разместить размер сообщения в качестве первого параметра вместо командной строки переменной длины. Таким образом, нет никакой двусмысленности в случае, если команда произойдет с двумя отдельными TCP-пакетами.

1

Я могу передать XML между клиентами; это сработает.

Для передачи файлов, возможно, просто передайте байтовый буфер; Я думаю, что проблема только в том, что вы идете между машинами высокого и низкого уровня.

+0

Осенью 2003 года мой одноклассник в классе моделирования выпускных систем сделал симуляционное исследование. В результате, использование XML для инкапсуляции данных было хорошим для двухступенчатой ​​производительности. Проблема в том, что, когда вы применяете все кодирование, XML имеет тенденцию обертывать около 800 бит (100 байт) вербальной фигуры вокруг каждого фактического 8 бит (1 байт) фактических данных. –

+0

@John R. Strohm: Создайте свой собственный DTD и держите его коротким. Я обнаружил, что большая часть многословных XML DTD - это катастрофа, но Это будет сообщение, как и a7x @dz ...

1

Довольно типичное решение здесь - это веб-службы, использующие SOAP.

1

Глупый вопрос: Почему бы не использовать протокол TELNET через TCP/IP для потока чата и что-то вроде FTP через TCP/IP для передачи файлов?

Смежные вопросы