Ice :: BadMagicException между сервером C ++ и клиентом браузера Javascript - PullRequest
0 голосов
/ 31 марта 2020

Я попробовал ICE, построив проект cpp hello world (сервер и клиент), и он работал отлично. Теперь у меня есть cpp сервер

Сервер

    try
    {
        Ice::CommunicatorHolder ich(argc, argv);
        auto adapter = ich->createObjectAdapterWithEndpoints("OnlineJudgeAdapter", "default -p 10000");
        auto servant = make_shared<ComsI>();
        adapter->add(servant, Ice::stringToIdentity("OnlineJudge"));
        adapter->activate();
        ich->waitForShutdown();
    }
    catch(const std::exception& e)
    {
        cerr << e.what() << endl;
        return 1;
    }

, который при компиляции и запуске кажется работающим. Я использую флаг --Ice.Trace.Network=2, поэтому вижу сетевой трафик c.

Мой клиент находится в Javascript в браузере. Я следовал руководству, чтобы добраться до:

Клиент

        try
        {
            const hostname = document.location.hostname || "127.0.0.1";
            const proxy = communicator.stringToProxy(`OnlineJudge:ws -h 127.0.0.1 -p 10000`);
            const judge = await OJMod
                .ComsPrx
                .checkedCast(proxy);

            if (judge) {
                await judge.listProblems();
            } else {
                $("#output").val("Invalid proxy");
            }
        } catch (ex) {
            console.log("NOPE");
            $("#output").val(ex.toString());
        }

HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ice/3.7.3/Ice.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ice/3.7.3/Glacier2.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ice/3.7.3/IceStorm.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ice/3.7.3/IceGrid.js"></script>
<script type="text/javascript" src="OnlineInterface.js"></script>
<script type="text/javascript" src="Client.js"></script>

Клиент csac.php и работает с использованием: php -S localhost:8000/csac.php

Я получаю следующие ошибки

На клиенте:

::Ice::ConnectFailedException
  ice_cause:  
    isTrusted: "true"  
    wasClean: "false"  
    code: "1006"  
    reason: ""  
    type: "close"  
    target:    
      URL: "ws://127.0.0.1:10000/"    
      url: "ws://127.0.0.1:10000/"    
      readyState: "3"    
      bufferedAmount: "0"    
      onerror: (null)    
      protocol: ""    
      extensions: ""    
      binaryType: "arraybuffer"    
      CONNECTING: "0"    
      OPEN: "1"    
      CLOSING: "2"    
      CLOSED: "3"  
    currentTarget: (recursive)  
    eventPhase: "2"  
    cancelBubble: "false"  
    bubbles: "false"  
    cancelable: "false"  
    defaultPrevented: "false"  
    composed: "false"  
    timeStamp: "4549"  
    srcElement: (recursive)  
    returnValue: "true"  
    NONE: "0"  
    CAPTURING_PHASE: "1"  
    AT_TARGET: "2"  
    BUBBLING_PHASE: "3"
  line: "975"
  column: "22"
  sourceURL: "https://cdnjs.cloudflare.com/ajax/libs/ice/3.7.3/Ice.js"
  error: "1006"

На сервере (из сетевой трассировки):

-- 03/31/20 15:06:36.123 ./judge: Network: trying to accept tcp connection
   local address = ::ffff:127.0.0.1:10000
   remote address = ::ffff:127.0.0.1:52339
-- 03/31/20 15:06:36.124 ./judge: Network: accepted tcp connection
   local address = ::ffff:127.0.0.1:10000
   remote address = ::ffff:127.0.0.1:52339
-- 03/31/20 15:06:36.124 ./judge: Network: closed tcp connection
   local address = ::ffff:127.0.0.1:10000
   remote address = ::ffff:127.0.0.1:52339
   src/Ice/ConnectionI.cpp:1676: ::Ice::BadMagicException:
   unknown magic number: 0x47, 0x45, 0x54, 0x20

Что такое исключение BadMagicException? Конфликт версий или передача строки прокси неправильно?

1 Ответ

0 голосов
/ 31 марта 2020

После некоторых копаний я обнаружил, что вам также нужно включить поддержку ws на сервере. Это можно сделать с помощью флага --Ice.Default.Protocol = ws.

./judge --Ice.Default.Protocol=ws исправляет проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...