C # Есть ли простой способ попасть в программирование сокетов TCP? - PullRequest
7 голосов
/ 25 ноября 2011

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

Но теперь домашняя работа сделана, и я хотел бы улучшить то, что я сделал. Проблема с программой находится в стадии развертывания. Слишком много папок / путей установки и административных проблем / проблем с совместным доступом, касающихся прямого доступа к базе данных в общей папке.

Так что хорошие люди здесь в stackoverflow посоветовали мне попробовать Socket Programming, что, я думаю, немного выходит за рамки моей лиги. Но ты никогда не знаешь ...

Кроме того, я знаю разницу между программированием сокетов Sync и Async. Один блокирует, другой нет. Программа, над которой я работаю, представляет собой простую пошаговую игру, поэтому я подумал, что Synchronous может быть достаточно хорош, поскольку, если это не ваша очередь, вы действительно ничего не сможете сделать. Проблема, однако, заключается в том, что программа считается «не отвечающей». Я попробовал асинхронный, но столкнулся с проблемами с многопоточностью, что я считаю ПУТЬ вне моей лиги.

По логике, программа проста. Один хост, один клиент. После подключения клиента хост отправляет данные. Затем клиент получает, отправляет свои данные. И так до тех пор, пока один из игроков не проиграет.

Извините, но в моей школе установлен только .NET 2.0. Нет WCF или что-нибудь. Кроме того, это должно быть сделано в C # Windows Forms, поэтому XNA отсутствует.

Итак, я хотел бы спросить ... есть ли простой способ попасть в Socket Programming? Любые руководства / примеры проектов, которые могут помочь? Готовые коды, которые можно изучить и адаптировать?

Большинство сэмплов, которые я нашел и адаптировал, являются приложениями для чата, которые, как мне показалось, достаточно хороши, но модульность просто ломает их.

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

Примеров приложения чата, с которым вы столкнулись, должно быть достаточно. Мне не ясно, что вы называете «делать модульным».

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

0x03 (длина сообщения)
0x0A (команда перемещения в этом вымышленном протоколе)
0x02 (параметр 1 команды, координата X в этом случае, все это определено в схеме протокола)
0x05 (параметр 2 команды, координата Y в этом случае, все это определено в схеме протокола)

Теперь все зависит от вас, что произойдет после того, как вы получили и интерпретировали данные. Лично я бы пошел на решение Async, так как он оставляет вашу программу для других вещей (графика?). И, по моему опыту, его легче адаптировать в коде.

0 голосов
/ 25 ноября 2011

Одно интересное, полезное и простое упражнение, которое вы можете сделать, чтобы узнать о сокетах (которые C # облегчает даже), - создание регистратора на основе TCP.

Во время разработки каждому программисту нужен способ узнать, что происходитпод капотом в определенных точках.Без регистратора вы обычно пишете что-то вроде:

Console.WriteLine( "blah" );

, что приводит к тусклой нефильтрованной неорганизованной строке, выбрасываемой в окно вывода.

Я очень легко создал регистратор на основе TCPиспользуя сокеты.В одной руке у вас есть отдельное приложение Winforms (сервер), которое отвечает за прослушивание входящих сообщений и их красивое отображение на элементе управления rich-content.С другой стороны, вы пишете очень простой класс (клиент) с единственной функцией, такой как:

public static class MyConsole
{
    public static void WriteLine( string message, string whatever )
    {
        // send to the net
        if( mTcpSocket.Connected )
            mTcpSocket.Send( message );

        // in case the server is not there we still have regular output
        Console.WriteLine( message );
    }
}

Я однажды создал этот регистратор и с тех пор использую его.Кроме того, учитывая его характер tcp, с небольшими изменениями на стороне сервера я успешно использовал его на разных языках, таких как C # и Java, а теперь использую его из ActionScript.

0 голосов
/ 25 ноября 2011

Я помню, когда я начинал с сокетной связи в C #, я пытался реализовать простую программу чата между клиентом и сервером, а затем между несколькими клиентами. Вот учебник, который я тогда читал: http://www.codeproject.com/KB/IP/TCPIPChat.aspx

Если вам нужен полный код, я могу загрузить свой окончательный проект, и вы можете изучить код. Он также использует многопоточность, поэтому вы можете увидеть, как справиться с этой ситуацией в приложениях с графическим интерфейсом.

Примечание: Вау, эта идея базы данных - самая сумасшедшая вещь, которую я видел с точки зрения связи ПК-ПК. Молодец!

0 голосов
/ 25 ноября 2011

Я создал несколько классов, которые можно использовать для переноса объектов через сокет, используя BinaryFormatter.

Вот несколько тестов для моего BinaryTransport класса:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1055425

Фактический класс:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1054822

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...