Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Winsock .NET Добавлено: 11.04.08 08:47  

Автор вопроса:  unw1s3 | ICQ: 923266 
Кто нибуть может обьяснить, как с ним правильно работать?!
Работал с Винсоком в вб6, но там всё, естественно,по другому.
Или же, кто дружит с английским(не транслейт.ру и подобное =)) прошу перевести http://www.codeproject.com/KB/vb/winsockdotnet.aspx#intro
скачивал демо проект, тоже особо не понял в нём.

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 ника



Вопросов: 1
Ответов: 111


 Профиль | | #1 Добавлено: 11.04.08 09:03
Тот пример уже не актуален. Если быть более точной, то это пример работы с winsock на низком уровне. С выходом FW 2.0 ситуация изменилась в лучшую сторону и FW предоставляет другие средства для работы с TCP. Обычно используют TcpClient для клиента и TcpListner для серверной части. Это те же winsock только заточенные под определенный протокол. И работа с ними на порядок проще. Примеров по работе с ними в сети - море ( в т.ч. в MSDN приведен классический пример)
А с появлением FW 3.0 и технологии WCF работа с распределенными приложениями вообще упростилась до безобразия. 5-10 строк кода и 2 приложения общаются между собой на уровне объектов при этом напрочь забываешь про реализацию обмена данными.. всю ту низкоуровневую работу выполняет WCF

Ответить

Номер ответа: 2
Автор ответа:
 unw1s3



ICQ: 923266 

Вопросов: 2
Ответов: 4
 Профиль | | #2 Добавлено: 13.04.08 09:40
Огомное спасибо за полноценный ответ! Буду мучить гугль ;)

Ответить

Номер ответа: 3
Автор ответа:
 pavel



Вопросов: 8
Ответов: 32
 Профиль | | #3 Добавлено: 03.04.11 16:41
я дико извиняюсь , а можно пример чата на вб.нет размером 5-10(можно и 20) строк

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 03.04.11 22:25
Набросал примре асинхронного сервера/клиента. Корректно работает с многобайтовыми кодирвоками (в данном случае используется UTF-8)
Нет обработки ошибок, возомжности переподключения, возомжности подключения нескольких клиентов.

Писал под последнюю версию VB, на старых могут потребоваться доработки.

Сервер:
  1. Imports System.IO
  2. Imports System.Net
  3. Imports System.Net.Sockets
  4. Imports System.Text
  5.  
  6. Module Module1
  7.  
  8.     Sub Main()
  9.         Dim server As New ChatServer(50, Sub(m) Console.WriteLine("Received: {0}", m))
  10.         server.StartListen()
  11.         Do
  12.             server.Send(Console.ReadLine())
  13.         Loop
  14.     End Sub
  15.  
  16. End Module
  17.  
  18. Public Class ChatServer
  19.  
  20.     Private _port As Int32
  21.  
  22.     Private _listener As TcpListener
  23.     Private _client As TcpClient
  24.     Private _clientStream As Stream
  25.     Private _stringReadBuffer As New StringBuilder
  26.     Private _readBuffer As Byte() = New Byte(8 * 1024 - 1) {}
  27.     Private _decoder As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder()
  28.  
  29.     Private _receivedCallback As Action(Of String)
  30.  
  31.     Public Sub New(port As Integer, receivedCallback As Action(Of String))
  32.         _port = port
  33.         _receivedCallback = receivedCallback
  34.     End Sub
  35.  
  36.     Public Sub StartListen()
  37.         _listener = New TcpListener(IPAddress.Any, _port)
  38.         _listener.Start()
  39.         _listener.BeginAcceptTcpClient(AddressOf ClientAcceptedCallback, Nothing)
  40.     End Sub
  41.  
  42.     Private Sub ClientAcceptedCallback(ar As IAsyncResult)
  43.         _client = _listener.EndAcceptTcpClient(ar)
  44.         _clientStream = _client.GetStream
  45.  
  46.         _clientStream.BeginRead(_readBuffer, 0, _readBuffer.Length, AddressOf ClientReadCallback, Nothing)
  47.     End Sub
  48.  
  49.     Private Sub ClientReadCallback(ar As IAsyncResult)
  50.         Dim packetLength As Int32 = _clientStream.EndRead(ar)
  51.  
  52.         FillStringBuffer(packetLength)
  53.  
  54.         WriteReceivedMessages()
  55.  
  56.         _clientStream.BeginRead(_readBuffer, 0, _readBuffer.Length, AddressOf ClientReadCallback, Nothing)
  57.     End Sub
  58.  
  59.     Private Sub FillStringBuffer(packetLength As Integer)
  60.         Dim charsCount = _decoder.GetCharCount(_readBuffer, 0, packetLength)
  61.  
  62.         Dim chars(charsCount - 1) As Char
  63.         _decoder.GetChars(_readBuffer, 0, packetLength, chars, 0)
  64.  
  65.         _stringReadBuffer.Append(chars)
  66.     End Sub
  67.  
  68.     Private Sub WriteReceivedMessages()
  69.         Dim messages As String() = _stringReadBuffer.ToString().Split(New String() {ControlChars.CrLf}, StringSplitOptions.None)
  70.         For i As Integer = 0 To messages.Length - 2
  71.             _receivedCallback(messages(i))
  72.         Next
  73.  
  74.         _stringReadBuffer.Clear()
  75.         _stringReadBuffer.Append(messages(messages.Length - 1))
  76.     End Sub
  77.  
  78.     Public Sub Send(message As String)
  79.         Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(message + ControlChars.CrLf)
  80.         _clientStream.BeginWrite(buffer, 0, buffer.Length, AddressOf ClientWriteCallback, Nothing)
  81.     End Sub
  82.  
  83.     Private Sub ClientWriteCallback(ar As IAsyncResult)
  84.         _clientStream.EndWrite(ar)
  85.     End Sub
  86. End Class


Клиент:
  1. Imports System.IO
  2. Imports System.Net.Sockets
  3. Imports System.Text
  4.  
  5.  
  6. Module Module1
  7.     Sub Main()
  8.         System.Threading.Thread.Sleep(500)
  9.  
  10.         Dim client As New ChatClient("127.0.0.1", 50, Sub(m) Console.WriteLine("Received: {0}", m))
  11.         client.Connect()
  12.         Do
  13.             client.Send(Console.ReadLine())
  14.         Loop
  15.     End Sub
  16. End Module
  17.  
  18. Public Class ChatClient
  19.  
  20.     Private _port As Int32
  21.     Private _address As String
  22.  
  23.     Private _client As TcpClient
  24.     Private _clientStream As Stream
  25.     Private _stringReadBuffer As New StringBuilder
  26.     Private _readBuffer As Byte() = New Byte(8 * 1024 - 1) {}
  27.     Private _decoder As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder()
  28.  
  29.     Private _receivedCallback As Action(Of String)
  30.  
  31.     Public Sub New(address As String, port As Integer, receivedCallback As Action(Of String))
  32.         _port = port
  33.         _address = address
  34.         _receivedCallback = receivedCallback
  35.     End Sub
  36.  
  37.     Public Sub Connect()
  38.         _client = New TcpClient()
  39.         _client.BeginConnect(_address, _port, AddressOf ClientConnectedCallback, Nothing)
  40.     End Sub
  41.  
  42.     Private Sub ClientConnectedCallback(ar As IAsyncResult)
  43.         _client.EndConnect(ar)
  44.         _clientStream = _client.GetStream
  45.  
  46.         _clientStream.BeginRead(_readBuffer, 0, _readBuffer.Length, AddressOf ClientReadCallback, Nothing)
  47.     End Sub
  48.  
  49.     Private Sub ClientReadCallback(ar As IAsyncResult)
  50.         Dim packetLength As Int32 = _clientStream.EndRead(ar)
  51.  
  52.         FillStringBuffer(packetLength)
  53.  
  54.         WriteReceivedMessages()
  55.  
  56.         _clientStream.BeginRead(_readBuffer, 0, _readBuffer.Length, AddressOf ClientReadCallback, Nothing)
  57.     End Sub
  58.  
  59.     Private Sub FillStringBuffer(packetLength As Integer)
  60.         Dim charsCount = _decoder.GetCharCount(_readBuffer, 0, packetLength)
  61.  
  62.         Dim chars(charsCount - 1) As Char
  63.         _decoder.GetChars(_readBuffer, 0, packetLength, chars, 0)
  64.  
  65.         _stringReadBuffer.Append(chars)
  66.     End Sub
  67.  
  68.     Private Sub WriteReceivedMessages()
  69.         Dim messages As String() = _stringReadBuffer.ToString().Split(New String() {ControlChars.CrLf}, StringSplitOptions.None)
  70.         For i As Integer = 0 To messages.Length - 2
  71.             _receivedCallback(messages(i))
  72.         Next
  73.  
  74.         _stringReadBuffer.Clear()
  75.         _stringReadBuffer.Append(messages(messages.Length - 1))
  76.     End Sub
  77.  
  78.     Public Sub Send(message As String)
  79.         Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(message + ControlChars.CrLf)
  80.         _clientStream.BeginWrite(buffer, 0, buffer.Length, AddressOf ClientWriteCallback, Nothing)
  81.     End Sub
  82.  
  83.     Private Sub ClientWriteCallback(ar As IAsyncResult)
  84.         _clientStream.EndWrite(ar)
  85.     End Sub
  86. End Class

Ответить

Номер ответа: 5
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #5 Добавлено: 04.04.11 07:48
а с WCF пример

Ответить

Номер ответа: 6
Автор ответа:
 ника



Вопросов: 1
Ответов: 111


 Профиль | | #6 Добавлено: 04.04.11 09:53
а WCF еще проще. Интерфейс с аттрибутами DataContract, DataMemeber + 2 класса. Имплементация и клиент. Да и в инете примеров полно

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 04.04.11 20:56
Интерфейс не обязательно. Контракт может быть описан самим классом, который реализует функции сервиса. Впрочем интерфейс не помешает.

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 04.04.11 21:00
ника пишет:
Интерфейс с аттрибутами DataContract, DataMemeber

ServiceContract и OperationContract. DataContract и DataMember - это на контракт данных

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам