@Arhin
Студент

Что делать если данные при передаче через сокеты сливаются?

Я передаю несколько данных, картинку и после текст через сокеты. При работе на локальном пк все было нормально более менее. Когда запустил приложение на разных пк(клиент и сервер), то почти все строки стали битыми.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
While True:
        # Recieve photo
        data = s.recv(1000000)
        image = png_bytes_2_opencv_image(data)
        coords = (1,2)
        
        # Recieve state
        data = s.recv(1000000)
        state = {}
        try:
            decoded_data = data.decode("utf-8")
            state = json_.loads(decoded_data)
        except Exception as e:
            print(e)


IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(addr), port);
        listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listenSocket.Bind(ipPoint);
            listenSocket.Listen(1);
            connected = true;
            Debug.Log("Сервер запущен. Ожидание подключений...");
            Application.runInBackground = true;
            listenerFlag = true;
            startServer();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
Socket handler = listenSocket.Accept();
while(true){
//Sending png
                    byte[] data_png = car_controller.PngFromCam;
                    handler.Send(data_png);

                    //Sending JSON
                    Dictionary<string, string> dict_data = new Dictionary<string, string>
                    {
                        ["ID"] = 0.ToString(),
                        ["CurrentSpeed"] = Math.Round(car_controller.CurrentSpeed, 1).ToString(),
                        ["CurrentSteering"] = Math.Round(car_controller.CurrentSteering, 1).ToString()
                    };
                    string json = MiniJSON.Json.Serialize(dict_data);
                    Debug.Log(json);
                    byte[] data_json = Encoding.UTF8.GetBytes(json);
                    handler.Send(data_json);
}
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что делать если данные при передаче через сокеты сливаются?

При работе с потоковыми протоколами так и должно быть. Если приложение работает с сообщениями -- приложение должно само организовать себе фрейминг в потоке данных.

Recieve

receive
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы