Vb net tcpclient передать файл пример

Обновлено: 06.07.2024

В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели. В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream. Однако при необходимости можно работать с байтами.

Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. Он построен на классе Socket и обеспечивает TCP-сервисы на более высоком уровне — в классе TcpClient есть закрытый объект данных m_ClientSocket, используемый для взаимодействия с сервером TCP. Класс TcpClient предоставляет простые методы для соединения через сеть с другим приложением сокетов, отправки ему данных и получения данных от него. Наиболее важные члены класса TcpClient перечислены далее:

Свойства и методы класса TcpClient
Свойство или метод Тип Описание
LingerState LingerOption Устанавливает или возвращает объект LingerOption, содержащий информацию о том, будет ли соединение оставаться открытым после закрытия сокета и как долго.
NoDelay bool Указывает, будет ли сокет задерживать отправку и получение данных, если буфер, назначенный для отправки или получения данных, не заполнен. Если свойство имеет значение false, TCP задержит отправку пакета, пока не будет накоплен достаточный объем данных. Это средство помогает избежать неэффективной отправки через сеть слишком маленьких пакетов.
ReceiveBufferSize int Задает размер буфера для входящих данных (в байтах). Это свойство используется при считывании данных из сокета.
ReceiveTimeout int Задает время в миллисекундах, которое TCpClient будет ждать получения данных после инициирования этой операции. Если это время истечет, а данные не будут получены, возникнет исключение SocketException.
SendBufferSize int Задает размер буфера для исходящих данных.
SendTimeout int Задает время в миллисекундах, которое TcpClient будет ждать подтверждения числа байтов, отправленных удаленному хосту от базового сокета. При истечении времени SendTimeout порождается исключение SocketException.
Close() Закрывает TCP-соединение.
Connect() Соединяется с удаленным хостом TCP.
GetStream() Возвращает объект NetworkStream, используемый для передачи данных между клиентом и удаленным хостом.
Active bool Указывает, есть ли активное соединение с удаленным хостом.
Client Socket Задает базовый объект Socket, используемый объектом TcpClient. Поскольку это защищенное свойство, к базовому сокету можно обращаться, если вы производите ваш класс от TcpClient.

Создание экземпляра класса TcpClient

В классе TcpClient существуют три перегруженных конструктора:

Конструктор, используемый по умолчанию, инициализирует экземпляр TcpClient. Если экземпляр TcpClient создается так, то для установления соединения с удаленным хостом надо вызвать метод Connect().

Второй перегруженный конструктор принимает один параметр типа IPEndPoint. Он инициализирует новый экземпляр класса TcpClient , связанный с указанной конечной точкой. Заметьте, что это не удаленная, а локальная конечная точка. Если попытаться передать конструктору удаленную конечную точку, будет порождено исключение, означающее, что в данном контексте IP-адрес задан некорректно.

Если использовать этот конструктор, то после создания объекта TcpClient, все-таки нужно вызвать метод Connect():

Параметр, переданный конструктору объекта TcpClient, является локальной конечной точкой, в то время как метод Connect() фактически соединяет клиента с сервером и поэтому принимает в качестве параметра удаленную конечную точку.

Последний перегруженный конструктор создает новый экземпляр класса TcpClient и устанавливает удаленное соединение с использованием в параметрах DNS-имени и номера порта:

Это самый удобный метод, он позволяет инициализировать TcpClient, разрешить DNS-имя и соединиться с хостом в одном простом шаге. Однако заметьте, что с помощью этого конструктора нельзя задать локальный порт, с которым желательно связаться.

Установка соединения с хостом

Создав экземпляр класса TcpClient, следующим шагом установим соединение с удаленным хостом. Для соединения клиента с хостом TCP предоставлен метод Connect(). Если для создания экземпляра TcpClient использовать конструктор по умолчанию или локальную конечную точку, то останется лишь вызвать этот метод, иначе, если конструктору были переданы имя хоста и номер порта, попытка вызова метода Connect() породит исключение. Существуют три перегруженных метода Connect():

Они достаточно просты, но, тем не менее, на коротких примерах продемонстрируем использование каждого перегруженного метода:

Передача объекта IPEndPoint, представляющего удаленную конечную точку, с которой надо соединиться:

Передача объекта IPAddress и номера порта:

Передача имени хоста и номера порта:

Если соединение будет неудачным или возникнут другие проблемы, порождается исключение SocketException:

Для обработки на уровне потока, как канал между двумя соединенными приложениями, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе. Следующий пример кода демонстрирует, как получить сетевой поток через метод GetStream():

Метод Read() имеет точно такой же набор параметров — массив байтов для сохранения данных, которые считываются из потока, позицию начала считывания и число считываемых байтов:

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

Закрытие сокета TCP

После взаимодействия с сервером, чтобы освободить все ресурсы, следует вызвать метод Close():

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

Помимо этой основной функциональности имеются другие возможности. Если требуется обратиться к экземпляру сокета, базовому для объекта TcpClient, например для установки опций методом SetSocketOption(), можно использовать свойство Client, получая доступ к членам соответствующего объекта Socket. Можно также использовать свойство Client, чтобы сделать существующий объект Socket базовым сокетом для объекта TcpClient. Но поскольку это защищенный член класса TcpClient, прежде чем его использовать, наш класс должен наследовать класс TcpClient.

Свойство Client дает возможность защищенного доступа к закрытому члену m_ClientSocket, о котором упоминалось ранее. Класс TcpClient передает сделанные на нем вызовы аналогичному методу класса Socket после проверки параметров и инициализации экземпляра сокета. Объект m_ClientSocket создается в конструкторе, который вызывает закрытый метод initialize(), строящий новый объект Socket, и затем вызывает метод set_Client(), чтобы назначить его свойству Client. Этот метод также устанавливает булево значение m_Active, используемое для отслеживания состояния экземпляра Socket. Он также проверяет наличие излишних соединений объекта Socket и операций, требующих установления соединения.

В общем у сокетов есть масса опций, которые класс TcpClient не охватывает. Если нужно установить или получить какое-либо из этих свойств, не представленных в TcpClient (например, Broadcast или KeepAlive), необходимо унаследовать класс от TcpClient и использовать его член Client.

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

Предоставляет клиентские подключения для сетевых служб протокола TCP.

Примеры

В следующем примере кода устанавливается TcpClient соединение.

Комментарии

TcpClient Класс предоставляет простые методы для подключения, отправки и получения потоковых данных по сети в синхронном блокирующем режиме.

Для TcpClient подключения и обмена данными, TcpListener или, Socket созданный с помощью протокола TCP, ProtocolType необходимо прослушивать входящие запросы на подключение. Подключиться к этому прослушивателю можно одним из следующих двух способов:

Создайте TcpClient и вызовите один из трех доступных Connect методов.

Создайте TcpClient с помощью имени узла и номера порта удаленного узла. Этот конструктор будет автоматически пытаться установить соединение.

Примечания для тех, кто наследует этот метод

Для отправки и получения данных используйте GetStream() метод для получения NetworkStream . Вызовите Write(Byte[], Int32, Int32) Read(Byte[], Int32, Int32) методы и объекта, NetworkStream чтобы отправлять и получать данные с удаленного узла. Используйте Close(Int32) метод, чтобы освободить все ресурсы, связанные с TcpClient .

Конструкторы

Инициализирует новый экземпляр класса TcpClient.

Инициализирует новый экземпляр класса TcpClient с заданным семейством.

Инициализирует новый экземпляр класса TcpClient и связывает его с заданной локальной конечной точкой.

Инициализирует новый экземпляр класса TcpClient и подключает его к указанному порту заданного узла.

Свойства

Получает или задает значение, указывающее, установлено ли подключение.

Возвращает значение, указывающее количество полученных из сети и доступных для чтения данных.

Возвращает или задает базовый объект Socket.

Возвращает значение, указывающее, подключен ли основной объект Socket для объекта TcpClient к удаленному узлу.

Возвращает или задает значение Boolean, указывающее, разрешает ли объект TcpClient использовать порт только одному клиенту.

Получает или задает информацию о состоянии задержки связанного сокета.

Возвращает или задает значение, которое отключает задержку в том случае, когда буферы отправки и получения не заполнены.

Возвращает или задает размер буфера приема.

Возвращает или задает длительность временного интервала, в течение которого объект TcpClient будет ожидать получение данных после инициации операции чтения.

Возвращает или задает размер буфера отправки.

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

Методы

Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается объектом IPAddress и номером порта (Int32).

Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается массивом IPAddress и номером порта (Int32).

Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается именем узла (String) и номером порта (Int32).

Удаляет данный экземпляр TcpClient и запрашивает закрытие базового подключения TCP.

Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.

Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.

Подключает клиента к удаленному TCP-узлу, используя указанную удаленную сетевую конечную точку.

Подключает клиента к указанному порту заданного узла.

Подключает клиента к удаленному TCP-узлу, используя заданный IP-адрес и номер порта в асинхронной операции.

Подключает клиента к удаленному TCP-узлу, используя заданный IP-адрес и номер порта в асинхронной операции.

Подключает клиента к удаленному TCP-узлу, используя заданные IP-адреса и номер порта в асинхронной операции.

Подключает клиента к удаленному TCP-узлу, используя заданные IP-адреса и номер порта в асинхронной операции.

Подключает клиента к удаленному TCP-узлу, используя указанную конечную точку в качестве асинхронной операции.

Подключает клиента к удаленному TCP-узлу, используя указанную конечную точку в качестве асинхронной операции.

Подключает клиента к указанному TCP-порту заданного узла в асинхронной операции.

Подключает клиента к указанному TCP-порту заданного узла в асинхронной операции.

Освобождает все управляемые и неуправляемые ресурсы, используемые TcpClient.

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

Завершает ожидающую асинхронную попытку на подключение.

Определяет, равен ли указанный объект текущему объекту.

Освобождает ресурсы, используемые классом TcpClient.

Служит хэш-функцией по умолчанию.

Возвращает объект NetworkStream, используемый для отправки и получения данных.

Возвращает объект Type для текущего экземпляра.

Создает неполную копию текущего объекта Object.

Возвращает строку, представляющую текущий объект.

Явные реализации интерфейса

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.

If ws.State = sckConnected Then
Dim x As Integer
Dim vBuf As String * 1000

Private Sub ws_DataArrival( ByVal bytesTotal As Long )

Dim vData As String
Dim x As Integer
x = 0

Не знаю пробывал по-разному не получается. может кто подскажет код?

Разработчик Offline Client

Разработчик Offline Client

Примеров и статей по винсоку достаточно. Если я приведу готовый исходный код, он будет работать, но чтобы ты в нём разобрался "до последней косточки" мне придется написать тут целую статью и прокоментировать каждую строчку исходного кода. Не поленись пойщи примеры сам. Тебе подойдут примеры практически всего: прокси серверов, сетевых пейджеров, сетевых игр итп итд. если это в виде статье, всё будет достаточно хорошо прокомментировано.

ICQ: 192496851

Неверно. по двум причинам:
1. В самих ДАННЫХ ФАЙЛА может содержаться твои "EE", "CC" и пр.
2. Гораздо лучше и быстрей в начале отослать строку типа "Get file. Length: 406254<<". И потом просто отсылаешь этот файл. Как его длина(406254) будет передана считай что все окей

Public Sub SendData(sFile As String , sSaveAs As String , tcpCtl As Winsock)
On Error GoTo ErrHandler
Dim sSend As String , sBuf As String
Dim ifreefile As Integer
Dim lRead As Long , lLen As Long , lThisRead As Long , lLastRead As Long

Я понять не могу строку sSend = sSend & sBuf - это означает что файл считывается по 64 кб в переменную sSend и РАЗОМ отправляется в сеть.
А строка tcpCtl.SendData sSend означает что Public Sub SendData исполняется только один раз. Да и почему перед ней указан DoEvents зачем передавать управление событиям "находящимся в очереди", да и собственно каким событиям? Объясните, пожалуйста, принцип действия кода.
Заранее спасибо большое.

Private Sub tcpClient_DataArrival( ByVal bytesTotal As Long )
Dim strData As String
Dim ifreefile

WinSock | Клиент и Сервер

Сегодня мы познакомимся с WinSock контролом.

WinSock - это компонент через который можно соединяться с удаленной машиной и обмениваться с ней данными.

WinSock использует 2 протокола:

1) UDP (User Datagram Protocol)

2) TCP (Transmission Control Protocol).

Оба эти протокола используются для создания Клиент-Серверных приложений.

Сначала создадим Сервер.

1. Создаем новый проект(Файл->Новый проект->Приложение Windows Form) или у кого версия английская (File->New Project->Application Windows Form)
2. Добавляем элемент WinSock.(смотрите видео кто не знает как добавить WinSock

3. Раз кликаем на WinSock1 и добавляем его на форму. Изменим у него свойство Name на tcpServer

tcpserver WinSock | Клиент и Сервер

4. Добавим на форму два TextBox'а и один Button

5. Вот что должно получиться(немного приукрасил)

tcpserver1 WinSock | Клиент и Сервер

6. Переходим к коду.

7. С сервером мы закончили. Сохраняем его и создаем новый проект. Это будет у нас клиент.12. На форму добавляем WinSock , два TextBox и два Button13. У WinSock изменим свойство Name на tcpClient14. Вот что должно получиться

tcpclient WinSock | Клиент и Сервер

8. Переходим к коду.

Запускаем сервер, а потом клиент.

Похожие записи:

20 комментариев

ммм у меня какиета ошибки в senddata в клиенте и в серваке

А почему у меня в visula baisic нету WinSock

Так я качал исходник и видео смотрел.
Но когда я открываю как навидео показано у меня там нету этого WinSock и всего 3 вкладки

на visual BAisic 2010

у вас нет на 2010 г WinSock?

Вы явно что-то путаете.
"Ищите в инете MSWINSCK.OCX" - с таким расширением только для VB6 подходит. Для VB.NET нужен WinSock.dll
"tcpClient.GetData(TextBox2.Text , vbString)" - необязательно, да и ругаться он не будет, т.к TextBox уже в типе String.

Должно, сам не испытывал, а вот знакомый писал что-то типа чата.
В клиенте он писал свой внешний адрес(который не должен изменяться), к которому будет будет подключатся клиент.
Попробуйте в клиенте и в сервере указать.
tcpClient.RemoteHost = "Внешний айпи адресс"
И потом скинуть другу клиент и попробывать проверить.

у меня при запуске вылетает

Значит делаете, что-то не правильно.

Зачем вы используете разные ники? Я вижу ваш АЙПИ адрес.

Хочу сделать морской бой что бы через инэт играть - но как - вот бы такой примерчик выложили - было бы супер - и что бы была возможность загрузить проект т.к. чайникам без этого нет ходу

видео в статье не увеличивается приходится идти на youtube

Есть такое. Попробую решить данную загвоздку. На счет примера, хм, посмотрю.

Перенёс код в VB6. Пришлось немного изменить. Но работает. Вопрос: если повторно нажать соединение на клиенте - вылетает ошибка. Как сообщить серверу, что клиент вышел и чтобы он сбросил соединение? При повторном запуске клиента(а сервер остался запущенным), при попытке соединиться, сервер молчит и ничего больше не принимает. Как сбросить соединение на сервере и чтобы он опять принимал от клиента соединение?

Старое удалять и создавать новое.

Если я правильно понимаю, winsock не подходит для автозаполнения форм на сайтах, тут скорее какой-нибудь компонент типа webbrowser нужен. Грузим страницу, выбираем элемент, присваиваем значение.

Читайте также: