Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: LAN .Net Добавлено: 22.05.09 13:40  

Автор вопроса:  AWР | Web-сайт: bomber.h17.ru | ICQ: 345685652 
Я всегда работал с сетью через WinSock. Дайте самый короткий пример чата по локалной сети через .Net(чтобы не таскать с программой компоненты винсока). я видел в МДСН только неработающие примеры. к тому же цикл wile true заставлял комп зависать.

Ответить

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

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 22.05.09 18:07
Что именно хочешь сделать? Примеры в MSDN рабочие, сам проверял.

Смотри классы TcpListner, TcpClient, может еще че-то.

Ответить

Номер ответа: 2
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #2
Добавлено: 22.05.09 18:08
необязательно полноценного чата.
Код Создания подключения, код Подключения и отправки/приема любой строки

Ответить

Номер ответа: 3
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #3
Добавлено: 22.05.09 18:10
смотрел. попроборвал неполучилось. из за цикла wile true вообще завис. тем более в МСДН всегда лишнего кода наворочают, так что нифига непонятно. короче говоря есть свои примеры?

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 22.05.09 19:44
какой именно пример ты смотрел? Приведи код.

Ответить

Номер ответа: 5
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #5
Добавлено: 22.05.09 21:49
ну вот запуск сервера
  1.  
  2.   Dim server As TcpListener
  3.         server = Nothing
  4.             Dim port As Int32 = 13000
  5.             Dim localAddr As IPAddress = IPAddress.Parse("192.168.217.168")
  6.             server = New TcpListener(localAddr, port)
  7.             server.Start()


а это вроде соединение
  1.  
  2. Dim port As Int32 = 13000
  3.             im client As New TcpClient(server, port)

НО! я не понимаю как узнать что соединение было произведено или что передана информация

Ответить

Номер ответа: 6
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #6
Добавлено: 22.05.09 21:54
Непонимаю я МСДНовский пример вобщем. нетрудно=напишите свой в минимум строк

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 22.05.09 22:22
В первом куске кода TcpLitner запускается для прослушки порта. Возьмите пример из MSDN и смотрите дальше, там в цикле идет server.AcceptTcpClient и так далее. Внимательнее смотрите документацию к этому классу.

Ответить

Номер ответа: 8
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #8
Добавлено: 23.05.09 21:47
server.AcceptTcpClient
вот это должно выполнятся при попытке подключения ..."подключающегося". а там стоит принимать всегда
While true
*****
*****
очень не нравится. Разве нельзя как в винсоке поставить на событие при попытках подключения.

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 23.05.09 21:59
Что конкретно тебе не нравится?
AcceptTcpClient выполняет ожидание подключения клиента.
То что этот метод обернут в бесконечный цикл While True означает что сервер будет бесконечно долго обрабатывать входящие подклюения клиентов. По крайней мере пока поток не упадет с исключением или не будет убит под действием внешних сил (Thread.Abort например, по сути то же падение с исключенем).

Событий у этого класса нет, поэтому поставить ты ничего не сможешь.

В реальном приложении этот код нужно будет запускать в отдельном потоке, чтоб он не мешал работе основного потока.
Можно также принимать клиентов не через AcceptTcpClient, а асинхронным методом BeginAcceptTcpClient, в этом случае основной поток продолжит работу дальше.

Ответить

Номер ответа: 10
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #10
Добавлено: 23.05.09 22:07
я перевел код в более понятный мне:
  1.         Dim Port As Int32 = 13000
  2.         Dim IP As IPAddress = IPAddress.Parse("192.168.217.168")
  3.         Dim server As New TcpListener(IP, Port)
  4.         server.Start()
  5.         Dim bytes(1024) As Byte
  6.         Dim data As String
  7.         Dim client As TcpClient = server.AcceptTcpClient()
  8.         Dim stream As NetworkStream = client.GetStream()
  9.         Dim i As Int32
  10.  
  11.         Try
  12.            
  13.             Me.Text = "Подключён"
  14.             i = stream.Read(bytes, 0, bytes.Length)
  15.             While (i <> 0)
  16.                 data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
  17.                 Console.WriteLine("Received: {0}", data)
  18.                 data = data.ToUpper()
  19.                 Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
  20.                 stream.Write(msg, 0, msg.Length)
  21.                 Console.WriteLine("Sent: {0}", data)
  22.                 i = stream.Read(bytes, 0, bytes.Length)
  23.             End While
  24.             client.Close()
  25.          
  26.         Finally
  27.             server.Stop()
  28.         End Try
окна нет. приложение зависло....или ждет чего то
а если писать
  1. Dim client As TcpClient = server.BeginAcceptTcpClient(System.AsyncCallback.Combine, 0)
то ошибка вылазит...

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 23.05.09 22:41
Naix пишет:
окна нет. приложение зависло....или ждет чего то
а если писать

Может потому что ты пустил этот код в оснвном потоке и он заблокировал его выполнение? Ждет подключения клиентов...

Naix пишет:
то ошибка вылазит...

Реально, рассказал даже информативнее чем On Error Resume NExt рассказывает :)
Там у ошибок названия бывают. А еще иногда описания и источники.

Вот простейший примре с делегатами, не претендующий ни на что, тем не менее работающий и иллюстрирующий идею.
  1.     Sub Main()
  2.         Dim Listener As New TcpListener(IPAddress.Any, 7777)
  3.         Listener.Start()
  4.         Listener.BeginAcceptSocket(AddressOf AcceptClient, Listener)
  5.         Console.ReadLine()
  6.     End Sub
  7.  
  8.     Sub AcceptClient(ByVal ar As IAsyncResult)
  9.         Dim Listener As TcpListener = CType(ar.AsyncState, TcpListener)
  10.         Dim Client As TcpClient = Listener.EndAcceptTcpClient(ar)
  11.         Console.WriteLine("Подключился клиент")
  12.  
  13.         Dim ClientStream As Stream = Client.GetStream
  14.  
  15.         Dim Writer As New StreamWriter(ClientStream, System.Text.Encoding.ASCII)
  16.         Writer.WriteLine("Hello, type something")
  17.         Writer.Flush()
  18.  
  19.         Dim Reader As New StreamReader(ClientStream, System.Text.Encoding.ASCII)
  20.  
  21.         Dim AcceptMessageDelegate As Action(Of TextReader) = AddressOf AcceptMessages
  22.         AcceptMessageDelegate.BeginInvoke(Reader, Nothing, Nothing)
  23.  
  24.         Listener.BeginAcceptSocket(AddressOf AcceptClient, Listener)
  25.     End Sub
  26.  
  27.     Sub AcceptMessages(ByVal Reader As TextReader)
  28.         Do
  29.             Dim Message As String = Reader.ReadLine
  30.             If Message Is Nothing Then Return
  31.             Console.WriteLine("Получено {0}", Message)
  32.         Loop
  33.     End Sub


Обработку ошибок, двунаправленый обмен и т.п. нужно будет добавить самому по своему усмотрению.

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 23.05.09 23:31
В процедуре AcceptClient стоит вызов Listener.BeginAcceptSocket(AddressOf AcceptClient, Listener) для того чтоб принять следующего клиента (несколько клиентов будут работать параллельно, можешь попробовать, запустив несколько telnet'ов, подключив их к приложению)

Ответить

Номер ответа: 13
Автор ответа:
 AWР



ICQ: 345685652 

Вопросов: 38
Ответов: 106
 Web-сайт: bomber.h17.ru
 Профиль | | #13
Добавлено: 23.05.09 23:38
Окно у меня зависает всегда когда есть цикл
  1. While true
  2. ***
  3. end while

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

Ответить

Номер ответа: 14
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #14
Добавлено: 23.05.09 23:59
ггг. найкс, ты понимаешь что такое поток? что такое основной поток? как вообще работает гуевая часть? это ж основы. если ты не понимаешь, почему при запуске цикла while true зависает гуй, то рано тебе с сетевыми штуками работать. почитай статьи\буки на эту тему. тут просто чужим кодом не отделаешься.

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 24.05.09 00:00
Naix пишет:
Окно у меня зависает всегда когда есть цикл

А что в VB6 если в форме запустить такой код, окно не повиснет???

Naix, ты серьезно или прикидываешься? Ты запускаешь бесконечный цикл в основном потоке формы. Почему ты
удивляешься что форма повисла? Она должна повиснуть, это именно то чего ты добился, запустив в ней бесконечный цикл (безусловно, это не то чего ты хотел добиться, но это уже тонкости).

Я тебе предложил 2 варианта решения этой проблемы (запустить отдельный поток, использовать асинхронные операции), более того один из них даже полностью реализовал (убив на это N-дцать минут своего времени).

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

PS Хинт, запусти код

  1. While true
  2.  
  3. End while
  4. MsgBox("Hello")

что выведет на экран?

Ответить

Страница: 1 | 2 | 3 |

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



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