Member 8325258 Ответов: 2

Как получить данные с прибора по протоколу TCP / IP ?


Привет,

я пытаюсь управлять инструментом с помощью visual basic по протоколу TCP/IP. До сих пор мы можем посылать команды прибору, но не можем принимать данные, посылаемые прибором. может ли кто-нибудь, пожалуйста, подсказать мне, как это сделать? Ниже приведен код, который мы используем:
Imports System.Net.Sockets
Imports System.IO

Public Class Form1
    Private Client As TCPControl

    Private Sub cmdConnect_Click(sender As Object, e As EventArgs) Handles cmdConnect.Click
        Client = New TCPControl("169.254.164.61", 3602)
        If Client.Client.Connected Then cmdConnect.Text = "Connected"
    End Sub

    Private Sub cmdSend_Click(sender As Object, e As EventArgs) Handles cmdSend.Click
        SendMessage()
        txtMessage.Clear()
        txtMessage.Focus()
    End Sub

    Private Sub SendMessage()
        If Client.Client.Connected = True Then Client.Send(txtMessage.Text)
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        If Client.Client.Connected = True Then
            Client.Client.Close()
        End If
    End Sub

End Class


Что я уже пробовал:

Мы перепробовали множество онлайн-учебников, но пока безуспешно.

2 Ответов

Рейтинг:
1

RickZeeland

Вот несколько примеров, TcpClient это, наверное, самый простой вариант:

TcpClient Класс (Система.Нет.Розетки)[^]

Связь Windows TCP в VB.NET образец в VB.NET, сценарий оболочки Windows для Visual Studio 2008[^]

TCP / IP с VB.NET[^]

Также убедитесь, что вы используете правильный Encoding, вот пример:
VB.NET связь сокетов TCP-клиент / сервер[^]

' Convert String to Byte array.
Dim mystring As String = "my string data"
Dim myarray() As Byte = System.Text.Encoding.ASCII.GetBytes(mystring)


Member 8325258

Спасибо Вам, Рикзиленд, за ваш ответ.Но мне нужен код на стороне клиента, который будет отправлять и получать данные в Строковой форме, а не в байтах.

VB.NET TCP клиент / сервер сокет связи[^]
Это мне не очень помогло.

Я ищу код, который будет получать данные, так как мой клиент отправляет данные правильно, но я не знаю, как их получить. Не могли бы вы мне в этом помочь?

Рейтинг:
0

Pawel Wzietek

Вот очень простой (но рабочий) класс, демонстрирующий, как использовать основные функции TcpClient класс. Полученный байтовый поток преобразуется в строку ASCII, вы можете легко адаптировать его, если вам нужна другая кодировка строки (например, UTF8).


Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text


Public Class MyClient
	
	'exported methods:
'  public bool Connect(string server, int port)
'      public bool IsConnected()
'    public void Send(string msg)
'    public string Read()
'    public bool DataAvailable()
	

	Public client As TcpClient

    
	Private stream As NetworkStream
	Private data As String

	'constructor
	Public Sub New()

		data = ""
	End Sub


	Public Function Connect(server As String, port As Integer) As Boolean


		Try
			client = New TcpClient(server, port)
			stream = client.GetStream()
			Return True
		Catch
			Return False
		End Try


	End Function

	Public Function IsConnected() As Boolean


		If Not client.Connected Then
			Return False
		Else
			Return (Not (client.Client.Poll(1, SelectMode.SelectRead) AndAlso (client.Available = 0)))
		End If


	End Function

	Public Sub Send(msg As String)
		Dim bytes As Byte() = System.Text.Encoding.ASCII.GetBytes(msg)
		stream.Write(bytes, 0, bytes.Length)

	End Sub


	Public Function Read() As String

		GetData()

		If data = "" Then
			Return ""
		Else
			Dim s As String = data
			data = ""
			Return s
		End If

	End Function

	Public Function DataAvailable() As Boolean
		Return stream.DataAvailable AndAlso IsConnected()

	End Function

	Private Sub GetData()
		If Not (client.Connected AndAlso stream.DataAvailable) Then
			Return
		End If


		' Buffer for reading data
		Dim bytes As Byte() = New [Byte](2047) {}
		' Loop to receive all the data sent by the client.

		Dim i As Integer

		While client.Connected AndAlso stream.DataAvailable


			i = stream.Read(bytes, 0, bytes.Length)

			data += System.Text.Encoding.ASCII.GetString(bytes, 0, i)
		End While
	End Sub



End Class