Проблема с декодированием строк. Программа связи VB.NET с Python - PullRequest
0 голосов
/ 16 марта 2019

Я работаю над проектом, в котором я хочу установить связь между приложением VB.NET (клиент) на Windows и приложением Python (сервер) на Raspberry Pi, что мне удалось сделать.

Всякий раз, когда я отправляю сообщение, клиентское приложение отправляет его на серверное приложение (в виде строки), где оно преобразуется в UTF-8. Текст преобразуется правильно, однако в конце каждого сообщения есть один дополнительный символ и добавляется одна дополнительная строка.

enter image description here

Мой код Python

import socket
import threading
import datetime


class Server:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connections = []

    def __init__(self):
        self.sock.bind(('0.0.0.0', 8521))
        self.sock.listen(1)

    def handler(self, c, a):
        while True:
            currentDT = datetime.datetime.now()
            data = c.recv(1024)
            for connection in self.connections:
                connection.send(data)
                dat = data.decode()
                print(currentDT.strftime("%I:%M:%S %p") + str(data, 'utf-8', 'ignore'))

                if data=='ShutDown':
                    break
            if not data:
                print(str(a[0]) + ':' + str(a[1]), "Disconnected")
                self.connections.remove(c)
                c.close()
                break


    def run(self):
        while True:
            c, a = self.sock.accept()
            cThread = threading.Thread(target=self.handler, args=(c, a))
            cThread.daemon=True
            cThread.start()
            self.connections.append(c)
            print(str(a[0]) + ':' + str(a[1]), "connected")
        c.close()


server = Server()
server.run()

ЧАСТЬ кода VB.NET, отвечающая за отправку сообщения

Dim client As TcpClient
Dim sWriter As StreamWriter
'.....
 Private Sub send(ByVal str As String)
    Try
        sWriter = New StreamWriter(client.GetStream)

        sWriter.WriteLine(str)

        sWriter.Flush()
    Catch ex As Exception
        xUpdate("You're not server")
    End Try
End Sub

Спасибо!

1 Ответ

0 голосов
/ 16 марта 2019

На самом деле, если подумать об этом, дополнительный символ, который вы видите, это, вероятно, возврат каретки, а дополнительная строка, вероятно, из-за перевода строки в конце.Например, если вы передаете «Hello World» в WiteLine, код Python, вероятно, интерпретирует это как две строки, первая из которых заканчивается возвратом каретки, а вторая - пустой строкой.Что вам, вероятно, нужно сделать, это вызвать Write вместо WriteLine, и если вы пишете один String, содержащий разрывы строк, замените все пары CR-LF просто LF:

Private Sub send(ByVal str As String)
    Try
        sWriter = New StreamWriter(client.GetStream)

        sWriter.Write(str.Replace(ControlChars.CrLf, ControlChars.Lf))

        sWriter.Flush()
    Catch ex As Exception
        xUpdate("You're not server")
    End Try
End Sub

Вам также может понадобиться написать один LF перед всеми, кроме первого сообщения, если вы отправляете несколько.

...