.NET 2.x P2P Connections ( Перевод - the_hangman ) - Visual Basic .NET
Формулировка задачи:
Этот мануал покажет, как создавать P2P (Peer To Peer) соединение с другим пользователем и передать данные в виде строки по сети. Это только базовый исходный код, но его логику можно расширить и перенести на что угодно. Я уже использовал этот исходный код для создания месенджера, нескольких онлайн-игр для нескольких игроков и некоторых других программ в которых используется обмен данных по сети.
Во-первых, давайте начнем работать с формой.
Создайте форму и добавьте туда 1 кнопку, 1 текстовое поле и 1 таймер . Сделайте текстовое поле достаточно большим для ввода сообщения. Для таймера установите свойство interval - 1, а свойство enabled - True.
Теперь давайте взглянем на исходный код. Вызовите окно кода для Form1.
Нам нужно будет импортировать несколько пространств имен в области до Public Class Form1.
Далее нам понадобится несколько переменных
Переменная Listener является TcpListener, которая прослушивает входящие соединения (данные, которые кто-то отправляет) на конкретном порту. Порт - это просто шлюз, через который вы хотите пропустить информацию. На самом деле не имеет значения, какой порт вы используете, если он еще не используется. Есть 65535 портов на выбор. Более низкие числа используются чаще, а более высокие обычно открыты, поэтому вы, скорее всего, найдете открытый порт, если выберете большое число. Мы собираемся использовать последний порт, ради этого.
Переменной Client является TcpClient , который в основном является другим компьютером, на который вы отправляете информацию.
Переменная Message является просто строкой для хранения входящих сообщений. Её мы сделаем пустой при загрузке формы, потому что пока мы не получили сообщения нет.
Когда Form1 начнет загружается, мы создадим отдельный поток, чтобы отделить циклические задачи от основного потока, что бы наша программа не зависла.
Эта часть должна быть довольно простой для понимания.
Dim ListThread создает поток. AddressOf - это адрес (sub), под которым ваш поток будет работать.
И ListThread.Start () запускает поток.
Очевидно, что sub Listening еще не существует , поэтому нам нужно его создать. Единственное, что нужно сделать этому sub, это запустить наш TcpListener (помните, он назывался Listener?)
Причина, по которой мы добавили это действие в поток, состоит в том, что если бы мы этого не сделали, наша программа зависла бы.
Теперь нам нужно что-то делать, когда TcpListener принимает соединение.
ПРИМЕЧАНИЕ. В этой части я использую таймер. Мне пока не удалось создать цикл, который будет прослушивать соединение, не создавая проблем где-нибудь.
Этот код делает проверку 1000 раз в секунду (если интервал таймера установлен в 1), чтобы TcpListener ловил входящее соединение. Если он примет соединение, то он начнет загружать сообщение от другого пользователя.
Сначала мы должны убедиться, что переменная Message пуста.
Затем мы должны принять соединение (вроде как отвечать на вызов телефона).
Мы будем использовать переменную TcpClient, которую мы создали ранее ( Client ), для хранения клиента (другого компьютера).
Затем мы должны запустить поток для приема данных. Поэтому мы создаем StreamReader, который может читать поток. Аргументом для StreamReader является считываемый поток. Мы инициируем поток от клиента с помощью аргумента Client.GetStream ().
Теперь пришло время прочитать из потока. Поскольку мы не можем прочитать сообщение, которого там нет, нам нужно убедиться, что там есть что-то что можно прочитать. Для этого мы будем читать один символ за раз, но мы будем использовать Reader.Peek (), который заглянет вперед на один пробел и проверит, что там есть данные и вернет индекс следующего символа. Если символа не будет, он вернет -1, поэтому до тех пор, пока Read.Peek () не вернет -1, поток будет продолжать работать.
Затем мы должны сохранить сообщение, которое мы получаем, в нашей переменной строчного типа - Message . Поскольку мы получаем только один символ за раз, мы добавим каждый символ в конец того что уже записали. Поэтому мы используем Message = Message + следующее символ. И, наконец, мы считываем данные с помощью Reader.Read(). Они будут представлены как бинарные данные, которые трудны для понимания человеком, поэтому нам нужно сначала преобразовать их в читаемые символы.
Кроме того, мы хотим увидеть простое и понятное сообщение в виде msgbox.
Последнее, что нам нужно сделать, чтобы завершить нашу P2P-программу, - отправить сообщение кому-либо, что мы сделаем, когда нажмем Button1
Снова мы используем переменную Client для соединения с другим компьютером. Но на этот раз, нам нужно определить кому мы отправляем данные и какой порт мы используем. Поскольку это демонстрация, мы просто подключимся сами к себе (и да, поговорим сами с собой), используя IP 127.0.0.1 (локальный адрес, если вы не знали). Так же вы можете разместить ещё один TextBox для ввода IP адреса и использовать его как адрес для подключения. Затем мы используем тот же порт, чтобы информация попадала туда, от куда идет.
Теперь давайте создадим поток для записи наших данных. Создайте StreamWrite, который может записывать из потока. Как и StreamReader, у него есть аргумент в котором поток записывает данные , и мы снова будем использовать Client.GetStream () . После этого мы записываем текст из TextBox1 в поток. И когда весь код начинает работать, то данные начинают интенсивно смываются, подобно смыванию туалета, чтобы все спустилось по трубе, куда ему и нужно идти.
Ох и убедитесь, что вы закрываете код с помощью:
Что бы остановить запущенный ранее поток.
Теперь вы можете запустить приложение и отправить себе сообщение.
Веселитесь!
Для записи: - StreamWriter и StreamReader являются частью пространства имен System.IO - TcpClient и TcpListener являются частью пространства имен System.Net.Socket - Thread является частью пространства имен System.Threading
Полный исходный код:Решение задачи: «.NET 2.x P2P Connections ( Перевод - the_hangman )»
textual
Листинг программы
Public Function EncryptData(ByVal plaintext As String) As String Try ' Переводим ключ в байтовый массив Dim plaintextBytes() As Byte = Encoding.Unicode.GetBytes(plaintext) ' Создается MemoryStream. Dim ms As New System.IO.MemoryStream ' Создание кодировщика Dim encStream As New CryptoStream(ms, TripleDes.CreateEncryptor(), CryptoStreamMode.Write) ' Использование шифрованного потока для записи массива. encStream.Write(plaintextBytes, 0, plaintextBytes.Length) encStream.FlushFinalBlock() ' Перевод ключа в тестовый формат. Return Convert.ToBase64String(ms.ToArray) Catch ex As Exception Return MsgBox("Ключи не совпадают!") End Try End Function Public Function DecryptData(ByVal encryptedtext As String) As String Try ' Переводим ключ в байтовый массив Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) ' Создается MemoryStream. Dim ms As New System.IO.MemoryStream ' Создание кодировщика Dim decStream As New CryptoStream(ms, TripleDes.CreateDecryptor(), CryptoStreamMode.Write) ' Использование шифрованного потока для записи массива. decStream.Write(encryptedBytes, 0, encryptedBytes.Length) decStream.FlushFinalBlock() ' Перевод ключа в тестовый формат. Return Encoding.Unicode.GetString(ms.ToArray) Catch ex As Exception Return MsgBox("Ключи не совпадают!") End Try End Function
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д