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

TCP обмен java->vb появляются символы �

15.08.2017, 16:23. Показов 1421. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
сервер - консольное приложение написан на vb
клиент - планшет на андроид написан на java (кодировка UTF-8)
1. открываю файл .csv и перевожу его в стринг
VB.NET
1
strLine = IO.File.ReadAllText(strPath & "" & strFileName, System.Text.Encoding.GetEncoding(1251))
2. затем отправляю его на клиент с кодировкой UTF-8. на клиент приходит без ошибок
3. сохраняю файл на клиенте.
4. отправляю сохраненный файл на сервер
5. принимаю файл на сервере и перевожу в стринг через UTF-8
итого в полученном стринге появляются символы �. каждый раз в разных местах.
подскажите пожалуйста как решить данную проблему.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2017, 16:23
Ответы с готовыми решениями:

Символы � при декодировании utf8 кириллицы
Добрый день ! У меня всплыл косяк . когда принимаю пакет байт и конвертирую в utf8 . Иногда кириллица отображается ��. ...

Что за символы "�"?
при установке движки, открыл install.php место нормального языка вот эти символы "� ������" как это исправить?

Обмен файлами по TCP
Есть рабочий клиент на андроид. 4 кнопки. 1.Установить соединение 2.Обмен данными. 3.Сохранить файлы 4.Закрыть соединение. ...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
15.08.2017, 16:45
Николай Пряхин, наверное что-то не так с кодировкой или процессом получения текста. Нужно видеть код с обоих сторон чтобы точнее ответить.
1
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
15.08.2017, 17:07  [ТС]
сервер
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic
 
Module Module1
    Sub Main()
        AsynchronousSocketListener.Main()
    End Sub
End Module
 
Public Class StateObject
    ' Client  socket.
    Public workSocket As Socket = Nothing
    ' Size of receive buffer.
    Public Const BufferSize As Integer = 1024
    ' Receive buffer.
    Public buffer(BufferSize) As Byte
    ' Received data string.
    Public sb As New StringBuilder
End Class 'StateObject
 
 
Public Class AsynchronousSocketListener
    ' Thread signal.
    Public Shared allDone As New ManualResetEvent(False)
 
    ' This server waits for a connection and then uses  asychronous operations to
    ' accept the connection, get data from the connected client, 
    ' echo that data back to the connected client.
    ' It then disconnects from the client and waits for another client. 
    Public Shared Sub Main()
        ' Data buffer for incoming data.
        Dim bytes() As Byte = New [Byte](1023) {}
 
        ' Establish the local endpoint for the socket.
        Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName())
        Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)
        Dim localEndPoint As New IPEndPoint(ipAddress, 12345)
 
        ' Create a TCP/IP socket.
        Dim listener As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
 
        ' Bind the socket to the local endpoint and listen for incoming connections.
        listener.Bind(localEndPoint)
        listener.Listen(100)
 
        While True
            ' Set the event to nonsignaled state.
            allDone.Reset()
 
            ' Start an asynchronous socket to listen for connections.
            Console.WriteLine("Waiting for a connection...")
            listener.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listener)
 
            ' Wait until a connection is made and processed before continuing.
            allDone.WaitOne()
        End While
    End Sub 'Main
 
 
    Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult)
        ' Get the socket that handles the client request.
        Dim listener As Socket = CType(ar.AsyncState, Socket)
        ' End the operation.
        Dim handler As Socket = listener.EndAccept(ar)
 
        ' Create the state object for the async receive.
        Dim state As New StateObject
        state.workSocket = handler
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
    End Sub 'AcceptCallback
 
 
    Public Shared Sub ReadCallback(ByVal ar As IAsyncResult)
        Dim content As String = String.Empty
 
        ' Retrieve the state object and the handler socket
        ' from the asynchronous state object.
        Dim state As StateObject = CType(ar.AsyncState, StateObject)
        Dim handler As Socket = state.workSocket
 
        ' Read data from the client socket. 
        Dim bytesRead As Integer = handler.EndReceive(ar)
        If bytesRead > 0 Then
            ' There  might be more data, so store the data received so far.
            state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead))
            ' Check for end-of-file tag. If it is not there, read 
            ' more data.
 
            content = state.sb.ToString()
        'Принимаем файлы
            If content.IndexOf("<EOF>") > -1 Then
                ' All the data has been read from the 
                ' client. Display it on the console.
                'Console.WriteLine("Read {0} bytes from socket. " + vbLf + " Data : {1}", content.Length, content)
                If InPath(content) = True Then
                    ' Echo the data back to the client.
                    'отправляем файлы
                    Send(handler, OutPath(content))
                End If
            Else
                ' Not all data received. Get more.
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
            End If
        End If
    End Sub 'ReadCallback
 
    Private Shared Sub Send(ByVal handler As Socket, ByVal data As String)
        ' Convert the string data to byte data using ASCII encoding.
        Dim byteData As Byte() = Encoding.UTF8.GetBytes(data)
 
        ' Begin sending the data to the remote device.
        handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
    End Sub 'Send
 
 
    Private Shared Sub SendCallback(ByVal ar As IAsyncResult)
        ' Retrieve the socket from the state object.
        Dim handler As Socket = CType(ar.AsyncState, Socket)
 
        ' Complete sending the data to the remote device.
        Dim bytesSent As Integer = handler.EndSend(ar)
        Console.WriteLine("Sent {0} bytes to client.", bytesSent)
 
        handler.Shutdown(SocketShutdown.Both)
        handler.Close()
        ' Signal the main thread to continue.
        allDone.Set()
    End Sub 'SendCallback
 
    Private Shared Function InPath(strContent As String) As Boolean
        Dim strGeneralPath As String = IO.Directory.GetCurrentDirectory & "\IN"
        Dim strUser As String = "3301001" '33-код региона, 01-код дистрибьютера, 001-код пользователя
        Dim arrFiles() As String = Split(strContent, "<EndFile>")
        Dim strFolder As String
        'проверяем регион
        strFolder = strGeneralPath & "" & Microsoft.VisualBasic.Left(arrFiles(0), 2)
        If IO.Directory.Exists(strFolder) Then
            'проверяем дистрибьютора
            strFolder = strFolder & "" & Mid(arrFiles(0), 3, 2)
            If IO.Directory.Exists(strFolder) Then
                'проверяем пользователя
                strFolder = strFolder & "" & Microsoft.VisualBasic.Right(arrFiles(0), 3)
                If IO.Directory.Exists(strFolder) Then
                    Console.WriteLine("Пользователь зарегистрирован.")
                    'MsgBox(arrFiles(1))
                    InPath = True
 
                    InFile(arrFiles, strFolder)
 
                    'OutPath(arrFiles(0))
                Else
                    Console.WriteLine("Ошибка. Код пользователя.")
                    InPath = False
                End If
            Else
                Console.WriteLine("Ошибка. Код дистрибьютора.")
                InPath = False
            End If
        Else
            Console.WriteLine("Ошибка. Код региона.")
            InPath = False
        End If
 
    End Function
 
    Private Shared Sub InFile(arrFiles() As String, strPath As String)
        For i = 1 To 1
            'Сохраняем файлы
            Dim obj As New Object
            Dim txt As New Object
            Dim arrFile() As String = Split(arrFiles(1), "<Start>")
            Dim strFileName As String = arrFile(0)
            Dim arrLines() As String = Split(arrFile(1), Chr(10))
            obj = CreateObject("Scripting.FileSystemObject")
            txt = obj.CreateTextFile(strPath & "" & strFileName, True)
            MsgBox("кол-во строк: " & arrLines.Count)
            For j = 0 To 50 'arrLines.Count - 2
                If arrLines(j) <> "" Then txt.Writeline(arrLines(j), )
            Next j
            txt.Close
            txt = Nothing
            obj = Nothing
            Console.WriteLine("Файл " & strFileName & " принят.")
        Next i
    End Sub
 
    Private Shared Function OutPath(strContent As String) As String
        Dim strGeneralPath As String = IO.Directory.GetCurrentDirectory & "\OUT"
        Dim arrFiles() As String = Split(strContent, "<EndFile>")
        Dim strFolder As String
 
        'проверяем регион
        strFolder = strGeneralPath & "" & Microsoft.VisualBasic.Left(arrFiles(0), 2)
        If IO.Directory.Exists(strFolder) Then
            'проверяем дистрибьютора
            strFolder = strFolder & "" & Mid(arrFiles(0), 3, 2)
            If IO.Directory.Exists(strFolder) Then
                'проверяем пользователя
                strFolder = strFolder & "" & Microsoft.VisualBasic.Right(arrFiles(0), 3)
                If IO.Directory.Exists(strFolder) Then
                    OutPath = OutFile(strFolder)
                    'OutPath(arrFiles(0))
                Else
                    Console.WriteLine("Ошибка. Код пользователя.")
                    OutPath = ""
                End If
            Else
                Console.WriteLine("Ошибка. Код дистрибьютора.")
                OutPath = ""
            End If
        Else
            Console.WriteLine("Ошибка. Код региона.")
            OutPath = ""
        End If
    End Function
 
    Private Shared Function OutFile(strPath As String) As String
        'Открываем файлы
        Dim strFileName As String = "CLIENTLIST.CSV"
        Dim strLine As String
 
        strLine = IO.File.ReadAllText(strPath & "" & strFileName, System.Text.Encoding.GetEncoding(1251))
 
        OutFile = strFileName & "<Start>" & strLine & "<EndFile><EOF>"
 
        MsgBox(strLine)
        'Console.WriteLine(strLine)
 
        Console.WriteLine("Файл отправлен.")
    End Function
End Class 'AsynchronousSocketListener
1
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
15.08.2017, 17:07  [ТС]
клиент
MainActivity
Java
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package ru.myregion33.apiconnect;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
 
public class MainActivity extends AppCompatActivity {
 
    private Button mButtonOpen  = null;
    private Button mButtonSend  = null;
    private Button mButtonGet  = null;
    private Button mButtonClose = null;
    private Button mButtonOpenF  = null;
    private Button mButtonSaveF = null;
    private LaptopServer mServer = null;
    private TextView tvMessage;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mButtonOpen = (Button) findViewById(R.id.button_open_connection);
        mButtonSend = (Button) findViewById(R.id.button_send_connection);
        mButtonGet = (Button) findViewById(R.id.button_get_connection);
        mButtonClose = (Button) findViewById(R.id.button_close_connection);
        mButtonOpenF = (Button) findViewById(R.id.button_open_file);
        mButtonSaveF = (Button) findViewById(R.id.button_save_file);
        mButtonSend.setEnabled(false);
        mButtonGet.setEnabled(false);
        mButtonClose.setEnabled(false);
        tvMessage = (TextView) findViewById(R.id.textView_Message);
 
        tvMessage.setMovementMethod(new ScrollingMovementMethod());
 
        mButtonOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mServer = new LaptopServer();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            mServer.openConnection();
                            runOnUiThread(new Runnable() {
 
                                @Override
                                public void run() {
                                    mButtonSend.setEnabled(true);
                                    mButtonGet.setEnabled(true);
                                    mButtonClose.setEnabled(true);
                                }
                            });
                        } catch (Exception e) {
                            Log.e(mServer.LOG_TAG, e.getMessage());
                            mServer = null;
                        }
                    }
                }).start();
            }
        });
 
        mButtonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mServer == null) {
                    Log.e(mServer.LOG_TAG, "?????? ?? ??????");
                }
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            String strFile = "3301001<EndFile>CLIENTLIST.CSV<Start>" + tvMessage.getText().toString() + "<EndFile><EOF>";
                            mServer.sendData(strFile.getBytes());
                        } catch (Exception e) {
                            Log.e(mServer.LOG_TAG, e.getMessage());
                        }
                    }
                }).start();
            }
        });
 
        mButtonGet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mServer == null) {
                    Log.e(mServer.LOG_TAG, "?????? ?? ??????");
                }
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            tvMessage.setText(mServer.getData());
                        } catch (Exception e) {
                            Log.e(mServer.LOG_TAG, e.getMessage());
                        }
                    }
                }).start();
            }
        });
 
        mButtonSaveF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String fileNumber = "<EndFile>";
                String[] splitFileNumber = tvMessage.getText().toString().split(fileNumber);
                String fileName = "<Start>";
                String[] splitFileName = splitFileNumber[0].split(fileName);
                saveFile(splitFileName[0]);
            }
        });
 
        mButtonOpenF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openFile("CLIENTLIST.CSV");
            }
        });
 
        mButtonClose.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                mServer.closeConnection();
                mButtonSend.setEnabled(false);
                mButtonGet.setEnabled(false);
                mButtonClose.setEnabled(false);
            }
        });
 
 
    }
 
    private void saveFile(String fileName) {
        try {
            String fileNumber = "<EndFile>";
            String[] splitFileNumber = tvMessage.getText().toString().split(fileNumber);
            String line = "<Start>";
            String[] splitFileName = splitFileNumber[0].split(line);
 
            OutputStream outputStream = openFileOutput(fileName, 0);
            OutputStreamWriter osw = new OutputStreamWriter(outputStream);
            osw.write(splitFileName[1]);
            osw.close();
            tvMessage.setText("???? ????????");
        } catch (Throwable t) {
            Toast.makeText(getApplicationContext(),
                    "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
        }
    }
 
    private void openFile(String fileName) {
        try {
            InputStream inputStream = openFileInput(fileName);
 
            if (inputStream != null) {
                InputStreamReader isr = new InputStreamReader(inputStream);
                BufferedReader reader = new BufferedReader(isr);
                String line;
                StringBuilder builder = new StringBuilder();
 
                while ((line = reader.readLine()) != null) {
                    builder.append(line + "\n");
                }
 
                inputStream.close();
                tvMessage.setText(builder.toString());
            }
        } catch (Throwable t) {
            Toast.makeText(getApplicationContext(),
                    "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
        }
    }
 
 
}
LaptopServer
Java
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package ru.myregion33.apiconnect;
 
import android.util.Log;
import java.io.BufferedReader;
import java.net.*;
import java.io.*;
 
public class LaptopServer {
 
    public static final String LOG_TAG = "myServerApp";
 
    private String mServerName = "11.11.11.11";
 
     private int mServerPort = 60006;
 
    private Socket mSocket = null;
 
    public LaptopServer() {}
 
 
    public void openConnection() throws Exception {
 
        closeConnection();
 
        try {
            mSocket = new Socket(mServerName,mServerPort);
 
        } catch (IOException e) {
            throw new Exception("���������� ������� �����: "+e.getMessage());
        }
    }
 
    public void closeConnection() {
 
        if (mSocket != null && !mSocket.isClosed()) {
 
            try {
                mSocket.close();
            } catch (IOException e) {
                Log.e(LOG_TAG, "���������� ������� �����: " + e.getMessage());
            } finally {
                mSocket = null;
            }
 
        }
        mSocket = null;
    }
 
    public void sendData(byte[] data) throws Exception {
        if (mSocket == null || mSocket.isClosed()) {
            throw new Exception("���������� ��������� ������. ����� �� ������ ��� ������");
        }
        try {
            mSocket.getOutputStream().write(data);
            mSocket.getOutputStream().flush();
        } catch (IOException e) {
            throw new Exception("���������� ��������� ������: "+e.getMessage());
        }
    }
 
 
    public String getData() throws Exception {
        if (mSocket == null || mSocket.isClosed()) {
            throw new Exception("���������� ��������� ������. ����� �� ������ ��� ������");
        }
        try {
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(mSocket.getInputStream()));
 
            String line;
            StringBuilder builder = new StringBuilder();
 
            while ((line = br.readLine()) != null) {
                builder.append(line + "\n");
            }
 
            String msg = builder.toString();
 
 
            return msg;
        } catch (IOException e) {
            throw new Exception("���������� ��������� ������: "+e.getMessage());
        }
    }
 
 
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        closeConnection();
    }
 
 
}
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,255
Записей в блоге: 4
15.08.2017, 21:19
Советы.
1. Вместо Socket используйте TcpListener, запись и чтение данных через StreamReader в кодировке на базе NetworkStream, полученный из TcpClient.
2. Для объединения путей в файлах и каталогах есть метод Path.Combine.
1
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
16.08.2017, 11:32  [ТС]
я правильно понимаю, что ошибка скорее всего на сервере?
и если я выполню совет №1, то ее не будет?
если не сложно, прошу выложить пример рабочего кода на прием сообщений на сервере
или хотя бы ссылку.
0
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
16.08.2017, 11:56  [ТС]
опробовал следующий код
заметил, что "?" появляется в начале и в конце блоков передаваемого текста
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
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Module Module1
 
    Sub Main()
        Try
            'Тcp- слушатель, по ip-адресу и порт
            Dim ip As IPAddress = IPAddress.Parse("11.11.11.11")
            Dim listener As TcpListener = New TcpListener(ip, 11111)
            'Начинаем прослушивание
            listener.Start()
            'Создаем клиента для принятия данных
            Dim client As TcpClient = listener.AcceptTcpClient()
            Dim ns As NetworkStream = client.GetStream()
            Dim connected As Boolean = True
            While connected = True
 
                'буффер для полученных данных
                Dim buffer() As Byte = New Byte(200) {}
                'считываем данные
                ns.Read(buffer, 0, buffer.Length)
                'Отображаем данные
                'Console.WriteLine(Encoding.UTF8.GetString(buffer))
                Dim strLine As String = Encoding.UTF8.GetString(buffer)
                MsgBox(strLine)
            End While
 
            ns.Close()
            Console.ReadLine()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
End Module
Миниатюры
TCP обмен java->vb появляются символы �  
0
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
16.08.2017, 14:10  [ТС]
есть следующие подозрения
файл приходит на сервер частями
преобразуется в стринг тоже частями
на этом этапе похоже и получаются разрывы байтов, которые невозможно преобразовать в стринг
подскажите пожалуйста как мне объединить части в единое целое, а потом преобразовать их в стринг.
думаю проблема на этом закроется.

Добавлено через 1 час 12 минут
сделал так. все равно бьет на части и появляются "?"
помогите пожалуйста. что делать?
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
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Module Module1
 
    Sub Main()
        Try
            'Тcp- слушатель, по ip-адресу 127.0.0.1 порт=2233
            Dim ip As IPAddress = IPAddress.Parse("11.11.11.11")
            Dim listener As TcpListener = New TcpListener(ip, 11111)
            'Начинаем прослушивание
            listener.Start()
            'Создаем клиента для принятия данных
            Dim client As TcpClient = listener.AcceptTcpClient()
            Dim ns As NetworkStream = client.GetStream()
            Dim connected As Boolean = True
            While connected = True
                Dim bytes(client.ReceiveBufferSize) As Byte
                ns.Read(bytes, 0, CInt(client.ReceiveBufferSize))
                Dim returndata As String = Encoding.UTF8.GetString(bytes)
                MsgBox(returndata)
            End While
            ns.Close()
            Console.ReadLine()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
End Module
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,255
Записей в блоге: 4
16.08.2017, 22:10
Лучший ответ Сообщение было отмечено Николай Пряхин как решение

Решение

Нужно понять как приходят данные. Являются ли они только текстовыми и в кодировке UTF-8.
Если так, то должна быть определённая последовательность символов, означающая конец строки. Например, нулевой байт. Или как в IRC и HTTP — символы с кодами 13 и 10 (CrLf).

Если конец строки обозначается через CrLf, то всё намного упрощается. На базе NetworkStream создаётся StreamReader и данные читаются методом ReadLine.

VB.NET
1
2
3
Dim ns As NetworkStream = client.GetStream()
Dim reader As New StreamReader(ns, System.Text.Encoding.UTF8)
Dim strLine As String = reader.ReadLine()
Добавлено через 20 минут
Если же данные не являются только текстовыми или разделитель данных не CrLf, то делаем так.

1. Создаём накопительный буфер, например, ArrayList(Of Byte).
2. Ищем в этом буфере последовательность байтов, означающих разделитель. Если не найдено, то получаем данные из сети и складируем их в накопительный буфер, например, через AddRange().
3. Повторяем шаг №2 до тех пор, пока символ разделитель строк не появится в накопительном буфере.
4. Получаем строку от начала накопительного буфера до этого символа.
5. Удаляем из накопительного буфера байты до разделителя и сам разделитель.
6. Оставшиеся байты в накопительном буфере сдвигаем в начало буфера.

Также можно увеличить размер буфера, куда NetworkStream записывает байты, чтобы получить все данные за один раз. Например, до одного мегабайта.
2
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
18.08.2017, 10:15  [ТС]
1.сообщение будет содержать несколько файлов .csv внутри текст в формате UTF-8
2.внутри файла есть разделители строк "Chr(10)"
3.конец файла обозначается через "<EndFile>"
4.конец сообщения всегда содержит "<EOF>"

Добавлено через 8 часов 8 минут
Проблему решил через StreamReader. Замабувараев, огромное спасибо. Но возникла другая проблема мне нужно асинхронное соединение. Где копать приблизительно понимаю, но может у кого есть готовое решение или ссылка на него. Заранее благодарен.
Выкладываю то, что получилось.
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
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
 
Module Module1
 
    Sub Main()
        MyTcpListener.Main()
    End Sub
 
End Module
 
Class MyTcpListener
    Public Shared Sub Main()
        Dim server As TcpListener
        server = Nothing
        Try
            ' Set the TcpListener on port.
            Dim port As Int32 = 11111
            Dim localAddr As IPAddress = IPAddress.Parse("11.11.11.11")
 
            server = New TcpListener(localAddr, port)
 
            ' Start listening for client requests.
            server.Start()
 
            ' Buffer for reading data
            Dim bytes(1024) As Byte
            Dim data As String = Nothing
 
            ' Enter the listening loop.
            While True
                Console.Write("Waiting for a connection... ")
 
                ' Perform a blocking call to accept requests.
                ' You could also user server.AcceptSocket() here.
                Dim client As TcpClient = server.AcceptTcpClient()
                Console.WriteLine("Connected!")
 
                data = Nothing
 
                ' Get a stream object for reading and writing
                Dim stream As NetworkStream = client.GetStream()
                Dim reader As New StreamReader(stream, System.Text.Encoding.UTF8)
 
                Do While reader.Peek() >= 0
                    data = reader.ReadLine()
                    Console.WriteLine(data)
                Loop
                reader.Close()
 
                ' Shutdown and end connection
                client.Close()
            End While
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        Finally
            server.Stop()
        End Try
 
        Console.WriteLine(ControlChars.Cr + "Hit enter to continue....")
        Console.Read()
    End Sub 'Main
End Class
Добавлено через 16 часов 46 минут
всем спасибо. тема закрыта. просмотрел. этот вариант и является асинхронным )).
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,255
Записей в блоге: 4
18.08.2017, 21:06
Никакой он не асинхронный. Метод StreamReader.ReadLine() не возвращает значения до до тех пор, пока не будут получены байты CrLf из сети.
Если необходимо не останавливать текущий поток, то рекомендую запустить ReadLine в отдельном потоке (будет работать везде), либо использовать ReadLineAsync (будет работать только на дотнете 4,5 и выше).
1
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 26
21.08.2017, 10:00  [ТС]
Замабувараев, я имел ввиду, что это предусмотрено в коде. у меня вот этот вариант без проблем работает. как только клиент отсоединяется, сервак ждет следующего соединения.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
 
Module Module1
    Sub Main()
        MyTcpListener.Main()
    End Sub
End Module
 
Class MyTcpListener
    Public Shared Sub Main()
        Dim server As TcpListener
        server = Nothing
        Try
            ' Set the TcpListener on port 13000.
            Dim port As Int32 = 11111
            Dim localAddr As IPAddress = IPAddress.Parse("11.11.11.11")
            server = New TcpListener(localAddr, port)
            ' Start listening for client requests.
            server.Start()
            Dim data As String = Nothing
            ' Enter the listening loop.
            While True
                Console.Write("Waiting for a connection... ")
                ' Perform a blocking call to accept requests.
                ' You could also user server.AcceptSocket() here.
                Dim client As TcpClient = server.AcceptTcpClient()
                Console.WriteLine("Connected!")
                data = Nothing
                ' Get a stream object for reading and writing
                Dim stream As NetworkStream = client.GetStream()
                Dim reader As New StreamReader(stream, System.Text.Encoding.UTF8)
                Dim strLine As String = Nothing
                Do While reader.Peek() >= 0
                    data = reader.ReadLine()
                    'Console.WriteLine(data)
                    strLine = strLine + data + Chr(10)
                Loop
                If InPath(strLine) = True Then
                    'отправляем файлы
                    'Перекодируем введенное сообщение в набор байтов
                    Dim message() As Byte = Encoding.UTF8.GetBytes(OutPath(strLine))
                    'считываем данные
                    stream.Write(message, 0, message.Length)
                End If
                reader.Close()
                ' Shutdown and end connection
                client.Close()
            End While
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        Finally
            server.Stop()
        End Try
        Console.WriteLine(ControlChars.Cr + "Hit enter to continue....")
        Console.Read()
    End Sub 'Main
 
    Private Shared Function InPath(strContent As String) As Boolean
        Dim strGeneralPath As String = IO.Directory.GetCurrentDirectory & "\IN"
        Dim strUser As String = "1101001" 
        Dim arrFiles() As String = Split(strContent, "<EndFile>")
        Dim strFolder As String
        'проверяем регион
        strFolder = strGeneralPath & "" & Microsoft.VisualBasic.Left(arrFiles(0), 2)
        If IO.Directory.Exists(strFolder) Then
            'проверяем дистрибьютора
            strFolder = strFolder & "" & Mid(arrFiles(0), 3, 2)
            If IO.Directory.Exists(strFolder) Then
                'проверяем пользователя
                strFolder = strFolder & "" & Microsoft.VisualBasic.Right(arrFiles(0), 3)
                If IO.Directory.Exists(strFolder) Then
                    Console.WriteLine("Пользователь зарегистрирован.")
                    InPath = True
                    InFile(arrFiles, strFolder)
                Else
                    Console.WriteLine("Ошибка. Код пользователя.")
                    InPath = False
                End If
            Else
                Console.WriteLine("Ошибка. Код дистрибьютора.")
                InPath = False
            End If
        Else
            Console.WriteLine("Ошибка. Код региона.")
            InPath = False
        End If
    End Function
 
    Private Shared Sub InFile(arrFiles() As String, strPath As String)
        For i = 1 To 1
            'Сохраняем файлы
            Dim obj As New Object
            Dim txt As New Object
            Dim arrFile() As String = Split(arrFiles(1), "<Start>")
            Dim strFileName As String = arrFile(0)
            Dim arrLines() As String = Split(arrFile(1), Chr(10))
            obj = CreateObject("Scripting.FileSystemObject")
            txt = obj.CreateTextFile(strPath & "" & strFileName, True)
            For j = 0 To arrLines.Count - 2
                If arrLines(j) <> "" Then txt.Writeline(arrLines(j))
            Next j
            txt.Close
            txt = Nothing
            obj = Nothing
            Console.WriteLine("Файл " & strFileName & " принят.")
        Next i
    End Sub
 
    Private Shared Function OutPath(strContent As String) As String
        Dim strGeneralPath As String = IO.Directory.GetCurrentDirectory & "\OUT"
        Dim arrFiles() As String = Split(strContent, "<EndFile>")
        Dim strFolder As String
        'проверяем регион
        strFolder = strGeneralPath & "" & Microsoft.VisualBasic.Left(arrFiles(0), 2)
        If IO.Directory.Exists(strFolder) Then
            'проверяем дистрибьютора
            strFolder = strFolder & "" & Mid(arrFiles(0), 3, 2)
            If IO.Directory.Exists(strFolder) Then
                'проверяем пользователя
                strFolder = strFolder & "" & Microsoft.VisualBasic.Right(arrFiles(0), 3)
                If IO.Directory.Exists(strFolder) Then
                    OutPath = OutFile(strFolder)
                Else
                    Console.WriteLine("Ошибка. Код пользователя.")
                    OutPath = ""
                End If
            Else
                Console.WriteLine("Ошибка. Код дистрибьютора.")
                OutPath = ""
            End If
        Else
            Console.WriteLine("Ошибка. Код региона.")
            OutPath = ""
        End If
    End Function
 
    Private Shared Function OutFile(strPath As String) As String
        'Открываем файлы
        Dim strFileName As String = "CLIENTLIST.CSV"
        Dim strLine As String
        strLine = IO.File.ReadAllText(strPath & "" & strFileName, System.Text.Encoding.GetEncoding(1251))
        OutFile = strFileName & "<Start>" & strLine & "<EndFile><EOF>"
        Console.WriteLine("Файл отправлен.")
    End Function
End Class 'MyTcpListener
Добавлено через 8 минут
я наверно неправильно написал. асинхронный метод это когда одновременно информация идет в обе стороны? Если так, то извиняюсь. Я имел ввиду, что после завершения соединения сервер ждет следующего подключения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2017, 10:00
Помогаю со студенческими работами здесь

Сгруппированный обмен сообщениями по TCP
Добрый день! Существует такие маленькие клиент-серверные приложения. Сервер: Dim port As Int32 = 10000 Dim serverSocket As...

MODBUS-TCP обмен данными
Моё простенькое чудо-приложение должно принимать/посылать данные от/на внешнее устройство. Внешнее устройство - ПЛК Овен, который...

Обмен Xml пакетами по TCP
Всем доброго времени суток. Есть задача: реализовать обмен Xml пакетами через Tcp между двумя точками в двух направлениях со 100% гарантией...

Tcp Сервер - Клиент обмен данными
Ситуация такая: есть Tcp клиент и сервер для xna игры. Реализован обмен объектами, которые содержатся в единой библиотеке. Объекты...

Обмен данными клиент-сервер TCP
Доброго дня! Столкнулся с проблемкой при обмене инфой по IdTCPClient и IdTCPServer, ситуевина такая: Сервер: begin ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru