Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
1

Сервер на сокетах: Нельзя повторно отправить данные на сервер

09.09.2012, 16:09. Показов 1934. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Делаю сервер на сокетах. Первая отправка данных на сервер проходит успешно, сервер получает и отвечает. Но повторный вызов события приводит к зависанию программы. Именно зависанию, а не ошибке. Код прилагаю:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                Dim varByte(10024) As Byte
                Dim varString As String
                strNetwork = tcpClient.GetStream
                varString = "login[main]" & vbCrLf & "UserName=" & varNameUser
                varByte = Encoding.UTF8.GetBytes(varString)
                strNetwork.Write(varByte, 0, varByte.Length)
                strNetwork.Flush()
 
                Dim varReadByte(10024) As Byte
                Dim varReadString As String
                strNetwork = tcpClient.GetStream
                strNetwork.Read(varReadByte, 0, CInt(tcpClient.ReceiveBufferSize))
                strNetwork.Flush()
                varReadString = Encoding.UTF8.GetString(varReadByte)
                MsgBox(varReadString)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2012, 16:09
Ответы с готовыми решениями:

Сервер на сокетах: невозможно повторно запустить сервер
пишу сервер на сокетах, но надо не в консоли, а на Windows Forms, значит по кнопке у меня сервер...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и...

Отправить данные на сервер
Здравствуйте, у меня такой вопрос, есть функция опредленная, которая кодирует текст. Мне нужно...

Отправить данные на другой сервер
Как методом POST отправить данные на другой сервер не используя FORM?

15
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
10.09.2012, 19:45 2
AxWinsock,TcpClient и прочие шплости
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
15.09.2012, 17:19  [ТС] 3
_Лёша_, это всё хорошо, но хотелось бы знать, почему мой код не работает так, как ему положено работать?
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
15.09.2012, 17:41 4
Цитата Сообщение от Infuzo Посмотреть сообщение
_Лёша_, это всё хорошо, но хотелось бы знать, почему мой код не работает так, как ему положено работать?
Хорошо бы увидеть его весь.
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
15.09.2012, 17:56  [ТС] 5
_Лёша_, и серверную часть тоже?
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
15.09.2012, 18:30 6
Цитата Сообщение от Infuzo Посмотреть сообщение
_Лёша_, и серверную часть тоже?
Желательно да
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
15.09.2012, 21:31  [ТС] 7
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Module Module1
    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public Declare Function WriteINI Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal Section As String, ByVal Key As String, ByVal putStr As String, ByVal INIfile As String) As Integer
    Public Function ReadINI(ByVal sSection As String, ByVal sKey As String, ByVal sIniFileName As String)
        Dim nLength As Integer
        Dim sTemp As String
        Dim lsTemp As Integer
        sTemp = Space(255)
        lsTemp = Len(sTemp)
        nLength = GetPrivateProfileString(sSection, sKey, "", sTemp, lsTemp, sIniFileName)
        Return Left(sTemp, nLength)
    End Function
 
    Dim ServerListner As New TcpListener(4000)
    Dim ServerSocket As TcpClient
    Dim readByte(10024) As Byte
    Dim writeByte(10024) As Byte
    Dim readString As String
    Dim writeString As String
    Dim ServerStream As NetworkStream
    Sub Main()
        Console.WriteLine(ReadINI("General", "HelloText", "Bin\text.ini") & " " & Now.Date & " " & Now.Hour & ":" & Now.Minute)
        ServerListner.Start()
 
 
        For i As Integer = 1 To 2
            i = 1
            ServerSocket = ServerListner.AcceptTcpClient
            ServerStream = ServerSocket.GetStream
            ServerStream.Read(readByte, 0, CInt(ServerSocket.ReceiveBufferSize))
            readString = Encoding.UTF8.GetString(readByte)
            ServerStream.Flush()
 
            If Mid(readString, 1, 5) = "login" Then Login(Mid(readString, 6).Trim)
 
        Next
 
    End Sub
 
    Sub Login(ByVal Content As String)
        Dim i As Integer = 0
        Dim FileNo As Integer
        Do
            i += 1
            FileNo = i
            If File.Exists("Server\login\" & i & ".ini") = False Then i = 1000
        Loop Until i = 1000
 
        Dim NewFileStream As StreamWriter = New StreamWriter("Server\login\" & FileNo & ".ini")
        NewFileStream.Write(Content)
        NewFileStream.Close()
 
        Console.WriteLine(ReadINI("main", "UserName", "Server\login\" & FileNo & ".ini") + " пытается зарегестрироваться.")
 
        writeString = ReadINI("main", "UserName", "Server\login\" & FileNo & ".ini") + "login" + "[main]" + vbCrLf + "res=True"
        writeByte = Encoding.UTF8.GetBytes(writeString)
        ServerStream = ServerSocket.GetStream
        ServerStream.Write(writeByte, 0, writeByte.Length)
        ServerStream.Flush()
 
        File.Delete("Server\login\" & FileNo & ".ini")
    End Sub
 
End Module
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
17.09.2012, 15:51  [ТС] 8
Ну что, не появилось никаких соображений по этому поводу?
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
18.09.2012, 17:08 9
Цитата Сообщение от Infuzo Посмотреть сообщение
Ну что, не появилось никаких соображений по этому поводу?
Вот, разбирайся
2 консольных приложения
сервер:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
 
Module Program
    Dim ServerListner As New TcpListener(Ipaddress.Any,4000)
    Dim readString As String
    Dim ServerStream As NetworkStream
    Dim  ServerSocket as TcpClient
    Dim  readByte() As Byte  = New [Byte]() {}
    
    Sub Main()  
 ServerListner.Start()
While True
           readByte  = New [Byte](128) {}
            ServerSocket = ServerListner.AcceptTcpClient
            ServerStream = ServerSocket.GetStream()
            ServerStream.Read(readByte, 0, ServerSocket.Available )
            readString = Encoding.Default.GetString(readByte)
            ServerStream.Flush()
            console.WriteLine(readString)
 
 End While
 end sub
End Module
клиент:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
 
Module Program
 
    Sub Main()
        Do
Console.WriteLine("Введите строку для отправки")
Dim varString As String = console.ReadLine()
dim tck as TcpClient = new TcpClient
tck.Connect("127.0.0.1",4000)
dim strNetwork as NetworkStream = tck.GetStream
dim varByte() As Byte = New [Byte]() {}
varByte = Encoding.Default.GetBytes(varString)
strNetwork.Write(varByte, 0, varByte.Length)
strNetwork.Flush()
loop
    End Sub
End Module
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
18.09.2012, 18:00  [ТС] 10
_Лёша_, спасибо.
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
18.09.2012, 18:10 11
Цитата Сообщение от Infuzo Посмотреть сообщение
_Лёша_, спасибо.
Только это все не сокеты... Про сокеты читай на MSDN, там с примерами есть. Чтобы форма не тормозила, нужно отсылать сообщения в другом потоке (для консоли не актуально).
1
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
21.09.2012, 10:45  [ТС] 12
_Лёша_, всё получилось. Проблема была в передаче данных с переводом строки vbCrLf. Решил я её так: передаю данные, где вместо перевода строки я поставил символ $, а уже в клиенте я эти данные просто переделываю этим кодом:
VB.NET
1
content = content.Replace("$", vbCrLf)
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
23.09.2012, 15:56  [ТС] 13
_Лёша_, хотя нет, я оказался не прав. Во всём виноват AcceptTcpClient, точнее неправильное моё использование. Заметил такую штуку - когда я пишу на сервере это:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Console.WriteLine(ReadINI("General", "HelloText", "Bin\text.ini") & " " & Now.Date & " " & Now.Hour & ":" & Now.Minute)
        SocketListner.Start()
        'Получение запроса.
        For i As Integer = 1 To 2
            Try
                SocketServer = SocketListner.AcceptTcpClient
                Dim varReadByte(10024) As Byte
                Dim varReadString As String
                strNetwork = SocketServer.GetStream
                strNetwork.Read(varReadByte, 0, SocketServer.ReceiveBufferSize)
                strNetwork.Flush()
                varReadString = Encoding.UTF8.GetString(varReadByte)
                'Отправка текста на определение дальнейшего действия.
                DetectSend(varReadString)
            Catch ex As Exception
            End Try
            i = 1
        Next
форма зависает после повторного исполнения кода, но при перезагрузке программы снова выполняется операция отправки единожды. А когда я пишу такой код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Console.WriteLine(ReadINI("General", "HelloText", "Bin\text.ini") & " " & Now.Date & " " & Now.Hour & ":" & Now.Minute)
        SocketListner.Start()
        'Получение запроса.
        For i As Integer = 1 To 2
            Try
                Dim varReadByte(10024) As Byte
                Dim varReadString As String
                strNetwork = SocketServer.GetStream
                strNetwork.Read(varReadByte, 0, SocketServer.ReceiveBufferSize)
                strNetwork.Flush()
                varReadString = Encoding.UTF8.GetString(varReadByte)
                'Отправка текста на определение дальнейшего действия.
                DetectSend(varReadString)
            Catch ex As Exception
                SocketServer = SocketListner.AcceptTcpClient
            End Try
            i = 1
        Next
тогда код в клиенте отправляется сколько угодно раз, но при перезагрузке программы данные вообще не отправляются. Подскажите, как правильно использовать AcceptTcpClient?
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
24.09.2012, 21:34 14
Выложи весь проект, вникать нет времени )
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 23
24.09.2012, 22:31  [ТС] 15
_Лёша_, тот же, что и прежде.
0
386 / 375 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
29.09.2012, 19:14 16
Цитата Сообщение от Infuzo Посмотреть сообщение
_Лёша_, тот же, что и прежде.
если тебе нужно помочь, то загрузи весь проект сюда в тему (архив создай), а то разбираться сидеть, где че куда у тебя отправляется у меня столько времени нет =)
0
29.09.2012, 19:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2012, 19:14
Помогаю со студенческими работами здесь

Отправить данные на сервер позже
Здравствуйте, хочу написать клиент серверное приложение но с поддержкой "позже отправлять ...

Отправить данные GPS на сервер
Добрый день! Получил задачу (в универе) создать GPS трекер который отправляет координаты на сервер....

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

Отправить данные из TextView на сервер
Как отправить данные с TextView и других текстовых view на сервер по нажатию на кнопку?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru